Abstract

This thesis builds upon previous literature for modeling value-at-risk (defined as an x% quantile of an asset’s daily returns) using non-linear ARMA terms by adding exchange-traded funds (ETFs) as explanatory variables that are combined into principal component vectors at the forecast origin. Combining these principal component vectors with transformations of lagged autoregressive response variables results in a model that produces similar predictive accuracy during periods of relatively low volatility along with more insight into the drivers of the changes in the response variable. In fact, one insight gained from the new model is a method of detecting changepoints in the economy by measuring the angle between resultant vectors calculated from the combination of principal component vectors during different time periods. This method, along with analysis of the statistical significance of the lagged ETFs, allows for insight into changes in the underlying economy.

Background and Introduction

When modeling financial time series, simply considering the mean and the variance is insufficient for an accurate depiction of the returns - stock returns are well-known for having fat tails and are difficult to model using a normal distribution (Fama 1965). In fact, modeling a 1% or a 5% quantile of daily returns is a better way to understand and predict what happens on the worst trading days and to give a clearer picture of what might happen during a downturn. Indeed, finance theory suggests that a primary reason why the S&P 500, which is a market-capitalization weighted index composed of the 500-largest publicly traded companies in the United States, has earned a 6.8% inflation-adjusted pre-tax return with dividend reinvestment from January 1871 through April 2020 (PK 2019) is because of the risk of a significant downturn. Kerry Pechter at Forbes describes it as a premium for the fact that “stocks are riskier” and “more prone to price fluctuations in the short run” compared to lower risk investments (Pechter 2020). A portfolio manager must indeed consider the long-run picture; a small difference in the annual rate of return can make an enormous difference in the ending value of investments. However, focusing entirely on long-run value generation is not the only consideration a prudent manager ought to make. While forecasting stock returns in the long-run is challenging, the performance of indices such as the S&P 500, despite seemingly existential threats such as the World Wars and the Great Depression, does give some confidence to investors who try to focus on long-run value generation. Ignoring the short-run reminds one of John Maynard Keynes’ famous maxim that the “long run is a misleading guide to current affairs” because “in the long run we are all dead” (Keynes 1923), and moreover, the short-run impact of a strategy is often more difficult to understand than the long-run results, and potentially more precarious. An investment manager using financial leverage to magnify returns (positive or negative) could be left in dire straits if their investments fell rapidly, despite a sound long-run strategy.

While there are other ways to understand and measure downside risk, a commonly accepted method is using value-at-risk (VaR). The metric is understood as follows: a one-day 1% VaR of -10 million dollars for a portfolio means that the portfolio will lose at least 10 million of its value on the 1% worst trading days. A major advantage of VaR is that it distills a distribution of returns into one number. As such, VaR is often used in stress testing by regulatory agencies in the United States, the United Kingdom, and Europe (Holton 2014).

A popular approach to modeling VaR called RiskMetrics (Longerstaey and Spencer 1996) was introduced by J.P. Morgan in 1994 and re-relased in 1996. The model assumed that a “portfolio or any asset’s returns follow a normal distribution over time” and used this along with the “variance-covariance method” to calculate VaR (Investopedia 2019). While this was certainly a step forward at the time, perhaps the model’s greatest downfall is the pretense of knowledge that modeling the distribution of returns in entirety is possible. The elegant simplicity of using a normal distribution is appealing - only having to estimate the mean and the variance to get a universal picture of returns is certainly appealing, and perhaps necessary in a time of comparatively limited computing power.

Having said that, modeling the big picture while making clear assumptions about the nature of returns has its’ perks, and is perhaps adventagous over altenatives for modeling VaR. Indeed, many of the approaches for modeling VaR rely on a semiparametric or a nonparametric historical simulation (Richardson, Boudoukh, and Whitelaw 2005). According to Robert Engle and Simone Manganelli in a 2004 paper, these methods are usually chosen for “empirical justifications rather than on sound statistical theory” (Engle and Manganelli 2004). They propose a framework called CAViaR that directly forecasts the VaR quantile using a conditional autoregressive quantile specification. This approach builds upon the statistical literature that extends linear quantile models to settings amenable to financial modeling, such as with heteroskedastic and nonstationary error distributions (Portnoy 1991).

Methods Used

The appeal of this model is that it combines the crisp statistical assumptions with the flexibility required to model financial returns. However, the model still runs into issues when a training sample is totally unrepresentative of the testing period - a common problem in statistical analysis. Initial motivations for this paper involved analyzing two stocks - Amazon (ticker: AMZN) and Proctor & Gamble (ticker: PG) and their performance during the Great Recession (specifically, the last 200 trading days of 2008). A relevant question of a financial institution would understandably be how their risk model performed during 2008, a highly volatile period which was driven by the “most severe financial crisis since the Great Depression”, according to Gary Becker (Becker 2008), a Nobel-prize winning economist. Interestingly, the univariate CAViaR forecast for Amazon was fairly accurate whereas the forecast for PG was not. One reason for this could be the fact that a stock like Amazon was highly volatile during the training sample, which included return data starting from the second quarter of 2004, but PG was fairly stable. How would it be possible for a univariate model such as CAViaR, that does not explicitly account for other factors, to forecast well? What if a volatile stock such as AMZN was included into the forecast for PG - would it improve the prediction?

package ‘data.table’ was built under R version 3.5.2data.table 1.12.2 using 1 threads (see ?getDTthreads).  Latest news: r-datatable.com
package ‘quantmod’ was built under R version 3.5.2Loading required package: xts
Loading required package: zoo
package ‘zoo’ was built under R version 3.5.2
Attaching package: ‘zoo’

The following objects are masked from ‘package:base’:

    as.Date, as.Date.numeric


Attaching package: ‘xts’

The following objects are masked from ‘package:data.table’:

    first, last

Loading required package: TTR
Version 0.4-0 included new data defaults. See ?getSymbols.
package ‘ggplot2’ was built under R version 3.5.2package ‘tseries’ was built under R version 3.5.2
    ‘tseries’ version: 0.10-47

    ‘tseries’ is a package for time series analysis and computational finance.

    See ‘library(help="tseries")’ for details.

package ‘dplyr’ was built under R version 3.5.2
Attaching package: ‘dplyr’

The following objects are masked from ‘package:xts’:

    first, last

The following objects are masked from ‘package:data.table’:

    between, first, last

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union

package ‘kableExtra’ was built under R version 3.5.2
Attaching package: ‘kableExtra’

The following object is masked from ‘package:dplyr’:

    group_rows

package ‘quantreg’ was built under R version 3.5.2Loading required package: SparseM

Attaching package: ‘SparseM’

The following object is masked from ‘package:base’:

    backsolve


Attaching package: ‘MTS’

The following object is masked from ‘package:TTR’:

    VMA

package ‘plot3D’ was built under R version 3.5.2package ‘citr’ was built under R version 3.5.2Loading required package: Rcpp
package ‘Rcpp’ was built under R version 3.5.2The working directory was changed to /Users/stevenmoen/Documents/GitHub/CAViaR inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.

Accuracy of VaR Forecast for PG Over Last 200 Trading Days in 2008
AMZN PG
VaR Break Rate 0.025 0.055
Theoretical VaR 0.010 0.010
Note:
Tested Using the Symmetric Absolute Value Model

Thus, the idea of combining stocks into a multivariate setting to capture correlations and better forecast risk was formed. A natural choice appeared to be the diffusion index model, originally developed by Stock and Watson for predicting conditional means (Stock and Watson 2002b, 2002a). The model for forecasting the conditional mean is specified below.

Diffusion Index Model

A useful means of predicting stock movements in the future is the Stock and Watson diffusion index. The model is outlined below, which is adapted from Multivariate Time Series Analysis With R and Financial Applications by Ruey S. Tsay (Tsay 2014).

There are two relevant equations, \(\boldsymbol{z_t} = \boldsymbol{Lf_t} + \boldsymbol{\epsilon_t}\) and \(y_{t+h} = \boldsymbol{\beta^\prime f_t} + \boldsymbol{e_{t+h}}\).

In the first equation, \(\boldsymbol{z_t} = (z_{1t}, ...., z_{kt})^\prime\) is an observed time series with mean 0, \(\boldsymbol{f_t}\) is an m-dimensional vector of common factors with mean 0 and identity covariance matrix, \(\boldsymbol{L}\) is a \(k \times m\) loading matrix, and \(\boldsymbol{\epsilon_t}\) is an independent and identically distributed (i.i.d.) sequence of random vectors with mean 0 and covariance matrix \(\boldsymbol{\Sigma_e}\).

In the second equation, which represents the h-step ahead prediction based on \(\boldsymbol{f_t}\), \(y_t\) is the scalar time series of interest, \(h\) is the forecast horizon, \(\boldsymbol{\beta}\) represents the vector of coefficients, and \(e_t\) is a sequence of uncorrelated random variables with mean 0 and constant variance.

To model the data, principal component analysis is performed on the covariates described below to obtain an estimate of \(\boldsymbol{f_t}\). When modeling the conditional mean, the \(\boldsymbol{\beta}\) coefficients are estimated using ordinary least squares, however in the specification below they are not. A specific formulation mentioned in the textbook is as follows, where the individuals diffusion indices are given by \(f_it\), and the goal is a one-step ahead prediction of \(y_t\):

\[ y_{t+1} = \beta_0 + \sum_{i=1}^m \beta_i f_{it} + e_t. \]

Univariate CAViaR Model Specifications

However, work needed to be done to align the diffusion index model with the CAViaR model, which is defined below. The following variables are required for use in the CAViaR model. For ease of notation, these are sourced directly from the Engle and Manganelli 2004 CAViaR paper (Engle and Manganelli 2004), with some added description:

  • \((y_t)_{t=1}^T\) is a “vector of portfolio returns”
  • \(\theta\) is the “probability associated with VaR” (a 5% VaR would mean \(\theta = 0.05\))
  • \(\boldsymbol{x_t}\) is a “vector of time \(t\) observable variables”
  • \(f_t(\boldsymbol{\beta}) \equiv f_t(\boldsymbol{x_{t-1}, \boldsymbol{\beta_\theta}})\) is the “time \(t \theta\) quantile of the distribution of portfolio returns formed at time \(t-1\)

The authors then describe a “generic CAViaR specification” as follows:

\[ f_t(\boldsymbol{\beta}) = \beta_0 + \sum_{i=1}^q \beta_i f_{t-1}(\boldsymbol{\beta}) + \sum_{j=1}^r \beta_j l(\boldsymbol{x_{t-j}}) \]

What is interesting about the general setup is that there are two main components to the model - lagged observed variables (represented by \(l\)) and lagged values of unknown parameters, which in the specification below is used as moving average terms. As such, it is reasonable to generalize the specifications below as nonlinear ARMA models where \(y_{t-1}\) terms refer to previous returns, whereas \(f_{t-1}(\beta_1)\) terms refer to previous predictions.

Adaptive CAViaR Model

Consider the following model:

\[ f_t(\beta_1) = f_{t-1}(\beta_1) + \beta_1\left[\left(1+ \exp(G[y_{t-1} - f_{t-1}(\beta_1)]) \right)^{-1} - \theta \right] \]

Following Engle and Manganelli’s 2004 paper, we choose \(G = 10\), so that is what is used in the results section of this paper. The authors state the reason for the seemingly arbitrary choice is that while “the parameter G itself could be estimated; however, this would go against the spirit of this model, which is simplicity”. Previous sensitivity analysis showed that running the adaptive model with \(G = 5\) did not materially affect the VaR predictions - the accuracy was not changed. While this model is nonlinear in G and total scale invariance in \(G\) would be surprising given the nonlinear relationship, the fact that the other fitted parameters likely adjusted is not surprising.

Symmetric Absolute Value CAViaR Model

Below is the symmetric absolute value CAViaR model:

\[ f_t(\boldsymbol{\beta}) = \beta_1 + \beta_2f_{t-1}(\boldsymbol{\beta}) + \beta_3|y_{t-1}|. \]

Asymmetric Slope CAViaR Model

Below is the asymmetric slope CAViaR model:

\[ f_t(\boldsymbol{\beta}) = \beta_1 + \beta_2f_{t-1}(\boldsymbol{\beta}) + \beta_3(y_{t-1})^+ + \beta_4(y_{t-1})^-. \]

Indirect GARCH (1,1) CAViaR Model

Below is the Indirect GARCH (1,1) model:

\[ f_t(\boldsymbol{\beta}) = (\beta_1 + \beta_2f_{t-1}^2(\boldsymbol{\beta}) + \beta_3y_{t-1}^2)^{1/2}. \]

Multivariate CAViaR Model Specifications

The multivariate CAViaR model takes inspiration from the models described above in several specifications, as mentioned in the original specifications. The general model form looks like the specification below:

\[ f_t(\boldsymbol{\beta}) = \beta_0 +\sum_{i=1}^p \beta_i y_{t-i} + \sum_{j=1}^m \beta_{j+p} f_{j,t-1} + e_t. \]

As with the univariate CAViaR model, the object of interest is a \(\theta\) percentile return and the model is fit iteratively to minimize the loss function on the training data. However, there are some notable differences between the univariate model and the multivariate model. First, there are no moving average terms (lagged error terms) - the reasoning for this is because this model aims for a clear economic interpretation, and crisp interpretations of MA models are harder to create. Also, moving average models require recursive estimation since error terms are not observed, and so developing a method to work with these errors in a robust regression framework is challenging.

Second, in some of the specifications below, there are lagged return variables. This is similar to the univariate CAViaR specification, though there is often more than 1 lag as in the univariate model - there are \(p\) lags in the dataset. Third, in all of the specifications below, there are \(m\) diffusion indices used in each model lagged by one time step to avoid look-ahead bias.

Multivariate CAViaR: No Lags Model

\[ f_t(\boldsymbol{\beta}) = \beta_0 +\sum_{j=1}^m \beta_{j} f_{j,t-1} + e_t \]

Multivariate CAViaR with Autoregressive Terms Added

\[ f_t(\boldsymbol{\beta}) = \beta_0 +\sum_{i=1}^p \beta_i y_{t-i} + \sum_{j=1}^m \beta_{j+p} f_{j,t-1} + e_t \]

Multivariate CAViaR with Symmetric Absolute Value Autoregressive Terms Added

\[ f_t(\boldsymbol{\beta}) = \beta_0 +\sum_{i=1}^p \beta_i |y_{t-i}| + \sum_{j=1}^m \beta_{j+p} f_{j,t-1} + e_t \]

Multivariate CAViaR with Asymmetric Slope Autoregressive Terms Added

\[ f_t(\boldsymbol{\beta}) = \beta_0 +\sum_{i=1}^p \beta_i (y_{t-i})_+ + \sum_{j=p+1}^{2p} \beta_i (y_{t-i})_- + \sum_{k=1}^m \beta_{k+2p} f_{k,t-1} + e_t \]

Fitting the Models

To fit the models, an optimal value of \(m\) diffusion indices and \(p\) autoregressive terms are added (or \(2p\) in the case of the asymmetric slope model). The optimal values of these parameters are determined using a validation dataset. In all of the runs below, there are a total of 5 years of trading days, or about 1,260 days assuming 252 trading days a year. The adjusted closing prices are logged and differenced, shortening the dataset by one. After doing this, the last 250 data points are reserved as test data, and the 250 data points before that are used as a validation set. Measured by the loss function written out below, the values of \(p\) and \(m\) that minimize losses are chosen and the optimal model is refit over both the training and the validation data combined and then evaluated on the test data. Note that there is an optimal model is chosen for each of the four multivariate CAViaR specifications described above, so there are 4 optimal sets of \(p\) and \(m\) chosen for each set of model. Thus, there are 8 models compared on the test data - 4 univariate CAViaR models and 4 multivariate CAViaR models.

From the CAViaR paper, the \(\theta\)th regression quantile is defined as any \(\boldsymbol{\hat{\beta}}\) that solves the following loss function:

\[ \overset{argmin}\beta \frac{1}{T}\sum_{t=1}^T [\theta - I(y_t < f_t(\boldsymbol{\beta}))][y_t - f_t(\boldsymbol{\beta})] \]

Theoretical Guarantees of Consistency and Asymptotic Normality

Part of the reason for working with the CAViaR and diffusion index is their strong theoretical guarantees about consistency and asymptotically. Indeed, following the results in Engle and Manganelli (Engle and Manganelli 2004), there are 8 conditions required for consistency of the \(\beta\) estimate and 4 required for asymptotic normality. The paper states that the model specified by:

\[ y_t = f(y_{t-1}, \boldsymbol{x}_{t-1},..., y_1, \boldsymbol{x}_1; \boldsymbol{\beta}^0) + \epsilon_{t \theta} [Quant_\theta (\epsilon_{t \theta} | \Omega_t) = 0] \] \[ \equiv f_t(\boldsymbol{\beta^0}) + \epsilon_{t \theta}, t = 1,...,T \]

“where \(f_1(\boldsymbol{\beta^0})\) is some given initial condition, \(\boldsymbol{x_t}\) is a vector of exogenous of predetermined variables, \(\boldsymbol{\beta^0} \in \mathbb{R}^p\) is the vector of true unknown parameters that need to be estimated, and \(\Omega_t = [y_{t-1}, \boldsymbol{x}_{t-1},...,y_1, \boldsymbol{x}_1; f_1 (\boldsymbol{\beta}^0)]\) is the information set available at time \(t\)”, and \(\boldsymbol{\hat{\beta}}\) is the paramter vector that minimizes the loss function specified above. According to theorems in the paper, they state that under favorable conditions, \(\boldsymbol{\hat{\beta}}\) is consistent and asymptotically normal.

Consistency

Per Engle and Manganelli, under the model specified above and using 8 assumptions given below, \(\boldsymbol{\hat{\beta}} \overset{p}\rightarrow \boldsymbol{\beta^0}\) where \(\boldsymbol{\hat{\beta}}\) is the paramter vector that minimizes the loss function specified above. There are 8 assumptions listed in the paper; most seem fairly standard.

  1. \((\Omega, F, P)\) is a complete probability space, and {\(\epsilon_{t \theta}\), \(\boldsymbol{x}_t\)}, t = 1,2,…. are random vectors on this space”
  2. “The function \(f_t(\boldsymbol{\beta}): \mathbb{R}^{k_t} \times B \rightarrow \mathbb{R}\) is such that for each \(\boldsymbol{\beta} \in B\), a compact subset of \(\mathbb{R}^p, f_t(\boldsymbol{\beta})\) is measurable with respect to the information set \(\Omega_t\) and \(f_t(\cdot)\) is continuous in \(B\), \(t = 1,2,....,\) for a given choice of explanatory variables {\(y_{t-1}, \boldsymbol{x}_{t-1}, ..., y_{1}, \boldsymbol{x}_{1}\)}.”
  3. “Conditional on all of the past information \(\Omega_t\), the error terms \(\epsilon_{t \theta}\) form a stationary process, with continuous conditional density \(h_t(\epsilon | \Omega_t)\).”
  4. “There exists \(h > 0\) such that for all \(t, h_t(0 | \Omega_t) \geq h\).”
  5. “|\(f_t(\boldsymbol{\beta})\)| < \(K(\Omega_t)\) for each \(\boldsymbol{\beta} \in B\) and for all \(t\), where \(K(\Omega_t)\) is some (possibly) stochastic function of variables that belong to the information set, such that \(\mathbb{E}(|K(\Omega_t)|) \leq K_0 < \infty\), for some constant \(K_0\)
  6. \(\mathbb{E}[|\epsilon_{t\theta}|] < \infty\) for all \(t\)
  7. “{\([\theta - I(y_t < f_t(\boldsymbol{\beta}))][(y_t - f_t(\boldsymbol{\beta}))]\)} obeys the uniform law of large numbers”
  8. “For every \(\xi > 0\), there exits a \(\tau > 0\) such that if ||\(\boldsymbol{\beta} = \boldsymbol{\beta}^0\)|| \(\geq \xi\), then \(\lim \inf_{T \rightarrow \infty} T^{-1} \Sigma P[|f_t(\boldsymbol{\beta}) - f_t(\boldsymbol{\beta^0})| > \tau] >0\)

When analyzing real data, it’s hard to verify any assumptions exactly, but one that is most controversial might be the third assumption - indeed, it seems highly unlikely that given all the past information, there would be a stationary process.

Asymptotic Normality

Also per Engle and Manganelli, under the same assumptions required for consistency as well as the assumptions below, there is a guarantee of asymptotic normality:

\[ \sqrt{T} \boldsymbol{A}_T^{-1/2}\boldsymbol{D}_T (\boldsymbol{\hat{\beta}} - \boldsymbol{\beta}^0) \overset{d}\rightarrow \mathcal{N}(0, \boldsymbol{I}) \]

where

\[ \boldsymbol{A}_T \equiv \mathbb{E} \left[T^{-1} \theta (1-\theta) \sum_{t=1}^T \nabla' f_t(\boldsymbol{\beta}^0) \nabla f_t(\boldsymbol{\beta}^0) \right] \]

and

\[ \boldsymbol{D}_T \equiv \mathbb{E} \left[T^{-1} \sum_{t=1}^T h_t(0|\Omega_t)\nabla' f_t(\boldsymbol{\beta}^0) \nabla f_t(\boldsymbol{\beta}^0) \right] \]

There are 4 assumptions listed in the paper required for asymptotic normality to hold. As with the assumptions required for consistency, these seem fairly standard as well:

  1. \(f_t (\boldsymbol{\beta})\) is differentiable in \(B\) and for all \(\boldsymbol{\beta}\) and \(\boldsymbol{\gamma}\) in a neighborhood \(\nu_0\) of \(\boldsymbol{\beta^0}\), such that \(||\boldsymbol{\beta} - \boldsymbol{\gamma}|| \leq d\) for \(d\) sufficiently small and for all \(t\):”
  1. \(||\nabla f_t (\boldsymbol{\beta})|| \leq F(\Omega_t)\), where \(F(\Omega_t)\) is some (possibly) stochastic funciton of variables that belong to the information set and \(\mathbb{E}(F(\Omega_t)^3) \leq F_0 < \infty\), for some constant \(F_0\).”
  2. \(||\nabla f_t (\boldsymbol{\beta})- \nabla f_t (\boldsymbol{\gamma})|| \leq M(\Omega_t, \boldsymbol{\beta}, \boldsymbol{\gamma}) = \mathcal{O}(||\boldsymbol{\beta} - \boldsymbol{\gamma}||)\), where \(M(\Omega_t, \boldsymbol{\beta}, \boldsymbol{\gamma})\) is some function such that \(\mathbb{E}[M(\Omega_t, \boldsymbol{\beta}, \boldsymbol{\gamma})]^2 \leq M_0||\boldsymbol{\beta} - \boldsymbol{\gamma}|| < \infty\) and \(\mathbb{E}[M(\Omega_t, \boldsymbol{\beta}, \boldsymbol{\gamma})]F(\Omega_t)] \leq M_1|\boldsymbol{\beta} - \boldsymbol{\gamma}|| < \infty\) for some constants \(M_0\) and \(M_1\).” 2a. “\(h(\epsilon|\Omega_t) \leq N < \infty \text{ } \forall t\), for some constant \(N\).”
  3. \(h(\epsilon|\Omega_t)\) satisfies the Lipschitz condition \(|h_t(\lambda_1 | \Omega_t) - h_t(\lambda_2 | \Omega_t)| \leq L|\lambda_1 - \lambda_2|\) for some constant \(L < \infty \text{ } \forall t\).”
  1. “The matrices \(\boldsymbol{A}_T \equiv \mathbb{E} \left[T^{-1} \theta (1-\theta) \sum_{t=1}^T \nabla' f_t(\boldsymbol{\beta}^0) \nabla \times f_t(\boldsymbol{\beta}^0) \right]\) and \(\boldsymbol{D}_T \equiv \mathbb{E} \left[T^{-1} \sum_{t=1}^T h_t(0|\Omega_t)\nabla' f_t(\boldsymbol{\beta}^0) \times \nabla f_t(\boldsymbol{\beta}^0) \right]\) have the smalles eigenvalues bounded below by a positive constant \(T\) for sufficiently large.”
  2. "The sequence {\(T^{-1/2} \sum_{t=1}^T[\theta - I(y_t < f_t(\boldsymbol{\beta}^0))] \nabla'f_t(\boldsymbol{\beta}^0)\)} obeys the central limit theorem.

As with the consistency conditions, these seem reasonable enough - the data considered in this analysis seems well-behaved enough such that these conditions are satisfied.

Data Used

The response variable used in this analysis is SPY, which is an exchange-traded fund that aims to track the performance of the S&P 500, which is discussed above. It is broadly used as a bellwether of the U.S. economy, and has the advantage of avoiding survivorship bias - while an individual stock might go bankrupt or merge with another, it is reasonable to assume that these issues do not apply with an ETF.

Following this logic, there are several classes of response variables used in this analysis. The first group is a set of U.S. sector ETFs obtained from Seeking Alpha (NA 2020). As with the response variable, these ETFs were publicly traded throughout the Great Recession of 2008.

  1. Utilities (XLU)
  2. Consumer Staples (XLP)
  3. Healthcare (XLV)
  4. Technology (XLK)
  5. Consumer Discretionary (XLY)
  6. Industrial (XLI)
  7. Financial Services (XLF)
  8. Basic Materials (XLB)
  9. Energy (XLE)

The second group is Global Sector ETFs, also from Seeking Alpha (NA 2020). The rationale for including these is that perhaps some global exposure is useful in understanding the broader market.

  1. Utilities (JXI)
  2. Consumer Staples (KXI)
  3. Healthcare (IXJ)
  4. Telecommunications (IXP)
  5. Technology (IXN)
  6. Consumer Discretionary (RXI)
  7. Industrial (EXI)
  8. Financial Services (IXG)
  9. Basic Materials (MXI)
  10. Energy (IXC)

The third group is bond ETFs. Like the previous two groups, these ETFs potentially contain forward-looking information about the stock market. These ETFs were chosen because they were the first fixed-income ETFs available in the United States, and had enough history for this paper (NA 2017).

  1. iShares 1-3 Year Treasury Bond Fund (SHY)
  2. iShares 7-10 Year Treasury Bond Fund (IEF)
  3. iShares 20+ Year Treasury Bond Fund (TLT)
  4. iShares iBoxx $ Investment Grade Corporate Bond ETF (LQD)

Lastly, all of the above three groups are run together. One reason for having bond and stocks grouped together is the fact that bonds are somewhat of a substitute for equities, which tend to drop more in a period of crisis (Amadeo 2020). As such, some unexplained movements in the stock price could be picked up by bond movements.

In each run, the explanatory variables are lagged to avoid look-ahead bias. All of the runs analyze the difference of the log of the adjusted closing price. The reason for using the differenced log is that it closely approximates the percentage change of the price for small changes. The reason for using the adjusted closing prices is that an adjusted closing price excludes the effects of “corporate actions such as stock splits, dividends / distributions and rights offerings” (Gant 2019). While dividends are essential to study the long-term performance of a strategy, studying short-term price movements do not require understanding the effects of dividend reinvestment. While there are many candidate ETFs chosen, these were chosen because they all had price history going back through the beginning of 2004.

Results

Big Simulation Function

For the sake of brevity, the results with only U.S. ETFs, global ETFs, or bonds is included in a later results section. The results are similar to the results below. To test how well the models do at different VaR levels, 1%, 5%, and 10% are tested.

2008 Test Period - All ETFs

1% VaR

5% VaR

10% VaR

The univariate CAViaR models significantly outperform the multivariate model, particularly at the 1% level. The extreme behavior towards the end of 2008 proved difficult for the multivariate model to pick up on.

2010 Test Period - All ETFs

1% VaR

5% VaR

10% VaR

The multivariate forecast is largely in line with the univariate CAViaR model. Generally, it seems like the univariate model does a better job tracking the response variable in the case of a large swing because of the moving average component. Also, while the multivariate models had a rate of VaR breaks that was too high for 2008, the rate of VaR breaks was generally too low for the multivariate models in 2010.

2014 Test Period - All ETFs

1% VaR

5% VaR

10% VaR

As with the 2010 results, the multivariate and univariate forecasts are very similar in accuracy for all 3 VaR levels. In terms of the VaR breakage rate for the 1% level, 3 out of the 4 multivariate models were extremely close. There also appears to be less differentiation between the multivariate and the univariate models compared to the 2010 and 2014 results.

2016 Test Period - All ETFs

1% VaR

5% VaR

10% VaR

As with 2010 and 2014, the results between model classes are similar. The multivariate model performs quite well with VaR breaks at the 5% and 10% level, and the models seem to be very closely clustered together.

Conclusions and Future Work

The problem of how to predict a low quantile of a stock’s log return when the training sample is substantially different from the test scenario is an enormously difficult problem. Almost axiomatically, the distribution is nonstationary over time. How is it possible to predict the return of an index like the S&P500 during a period of market turmoil such as the Great Recession? While the univariate CAViaR model performs comparatively well during times of stress, it performs about the same as the multivariate CAViaR model during more benign economic periods.

This conclusion drawn from the above results might support the notion of combining the two models in some sort of a mixture model - aiming to use the basket of ETFs during good times, and use the CAViaR ARMA specification during bad times. The approach of using ETFs allows a prediction based on forward-looking expectations of fundamental factors. Indeed, ETFs are just baskets of individual stocks or bonds, and those securities are (in theory) based on rational expectations about future resources, market conditions, etc - the microfoundations of what drives our economy. The ARMA specification, while practically and statistically sound, is contradicted by economic theory and practice - the weak form of the efficient market hypothesis states that it is impossible to forecast future values of asset prices using past values. But perhaps this view is incomplete.

Any model that attempts to capture relationships in the real world will only work until an omitted variable is found. The elegance of the multivariate CAViaR model is that it provides insight into why a prediction is wrong; the change in the angle between resultant vectors is a sensible measurement of economic changepoints. However, errors in the world are costly, and it is wishful thinking to say that explaining why the error occurred is sufficient.

As such, for future work it is worth exploring the notion of weighting an ARMA-approach more heavily when predictions using fundamentals were too high, then not only would this after-the-fact recognition be achieved, but also a hierarchical model that captures fundamental relationships in the economy and potentially changes our understanding of asset prices in general - a synthesis between Keynes’ animal spirits during a time of severe crisis; where a model cannot explain shifts, and a more rational world that explains other periods. In addition to significant predictive power because of the switching between the two worlds, there is also an elegant explanation; a way to explain changes in the usefulness of the underpinnings in the economy. Because of the flexibility of the model, it is entirely possible that a whole gamut of variables could be tossed in and backtested to when “changepoints” occurred.

Additional future work involves developing theoretical guarantees on the parameters in the multivariate CAViaR model. One advantage of both the diffusion index model and the CAViaR model is that both have theorems about asymptotic normality and consistency.

Additional Results

2008 Test Period

U.S. ETFs

The results for the U.S. ETFs clearly show that the univariate model outperforms the multivariate model during the great recession.

Global ETFs

While the model with the global ETFs as predictors performs better than the model with U.S. ETFs, the univariate CAViaR model outperforms the multivariate model.

Bond ETFs

As with the previous two runs, the univariate model outperforms the multivariate model.

2010 Test Period

U.S. ETFs

The results are much better for the multivariate model here during a more benign period.

Global ETFs

As with the U.S. ETFs, the results are better.

Bond ETFs

As with the previous two runs, the results from the bond ETFs are better than those from 2008.

2014 Test Period

U.S. ETFs

As with the results in 2014, the results from the U.S. ETFs shows a similar quality of predictions.

Global ETFs

The results show that the multivariate predictions are of similar quality to the predictions from the univariate model.

Bond ETFs

As with the other two sets of regressors, the results here show that the multivariate predictions are of similar quality to the predictions from the univariate model.

2016 Test Period

U.S. ETFs

As with the forecast in 2010 and 2014, including the U.S. ETFs as predictors in the multivariate model gives similar results to that of the univariate model.

Global ETFs

The global ETFs as predictors provide solid results as well.

Bond ETFs

As with the U.S. and Global ETFs, the bond ETFs provide good results.

Code Appendix

Literature Cited

Amadeo, Kimberly. 2020. “How Bonds Affect the Stock Market.” The Balance. https://www.thebalance.com/how-bonds-affect-the-stock-market-3305603.

Becker, Gary. 2008. “We’re Not Headed for a Depression.” https://www.wsj.com/articles/SB122333679431409639.

Engle, Robert F, and Simone Manganelli. 2004. “CAViaR.” Journal of Business & Economic Statistics 22 (4). Taylor & Francis: 367–81. https://doi.org/10.1198/073500104000000370.

Fama, Eugene F. 1965. “The Behavior of Stock-Market Prices.” The Journal of Business 38 (1). University of Chicago Press: 34–105. http://www.jstor.org/stable/2350752.

Gant, Akhilesh. 2019. “Adjusted Closing Price Definition.” https://www.investopedia.com/terms/a/adjusted{\_}closing{\_}price.asp.

Holton, Glyn A. 2014. “History of VaR - Value-at-Risk: Theory and Practice.” https://www.value-at-risk.net/history-of-value-at-risk/.

Investopedia. 2019. “What is RiskMetrics in Value at Risk ( VaR )?” https://www.investopedia.com/ask/answers/041615/what-riskmetrics-value-risk-var.asp.

Keynes, John Maynard. 1923. A tract on monetary reform, London: Macmillan; Co., Limited.

Longerstaey, Jacques, and Martin Spencer. 1996. “RiskMetrics - Technical Document.” New York: J.P. Morgan/Reuters. http://www.jpmorgan.com/RiskManagement/RiskMetrics/RiskMetrics.html.

NA. 2017. “iShares Institutional Guide to Bond ETFs.” https://www.complianceweek.com/download?ac=5780.

———. 2020. “Sector ETFs | Seeking Alpha.” https://seekingalpha.com/etfs-and-funds/etf-tables/sectors.

Pechter, Kerry. 2020. “You Need to Understand the ‘Equity Risk Premium’.” https://www.forbes.com/sites/kerrypechter/2020/04/04/erp-zirp-and-when-to-get-back-into-the-market/{\#}36566af6e4d1.

PK. 2019. “S&P 500 Return Calculator, with Dividend Reinvestment.” https://dqydj.com/sp-500-return-calculator/.

Portnoy, Stephen. 1991. “Asymptotic behavior of regression quantiles in non-stationary, dependent cases.” Journal of Multivariate Analysis 38 (1): 100–113. https://doi.org/https://doi.org/10.1016/0047-259X(91)90034-Y.

Richardson, Matthew P., Jacob (Kobi) Boudoukh, and Robert F Whitelaw. 2005. “The Best of Both Worlds: A Hybrid Approach to Calculating Value at Risk.” SSRN Electronic Journal. https://doi.org/10.2139/ssrn.51420.

Stock, James H, and Mark W Watson. 2002a. “Macroeconomic Forecasting Using Diffusion Indexes.” Journal of Business & Economic Statistics 20 (2). Taylor & Francis: 147–62. https://doi.org/10.1198/073500102317351921.

———. 2002b. “Forecasting Using Principal Components from a Large Number of Predictors.” Journal of the American Statistical Association 97 (460). [American Statistical Association, Taylor & Francis, Ltd.]: 1167–79. http://www.jstor.org/stable/3085839.

Tsay, Ruey. 2014. Multivariate Time Series Analysis. John Wiley & Sons, Inc.

LS0tCnRpdGxlOiAiTXVsdGl2YXJpYXRlIENBVmlhUiIKc3VidGl0bGU6ICJBbiBJbnNpZ2h0ZnVsIEFwcHJvYWNoIHRvIFJpc2sgTW9kZWxpbmciCmF1dGhvcjogIlN0ZXZlbiBNb2VuJ3MgTS5TLiBUaGVzaXMiCmRhdGU6ICJUdWVzZGF5LCBNYXkgMTJ0aCwgMjAyMCIKb3V0cHV0OgogIHBkZl9kb2N1bWVudDogZGVmYXVsdAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKYmlibGlvZ3JhcGh5OiB0aGVzaXNfYmlibGlvZ3JhcGh5LmJpYgpsaW5rLWNpdGF0aW9uczogeWVzCi0tLQoKYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OCwgZmlnLnBhdGg9J0ZpZ3MvJywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgY2FjaGUgPSBUUlVFKQpgYGAKCiMgQWJzdHJhY3QKClRoaXMgdGhlc2lzIGJ1aWxkcyB1cG9uIHByZXZpb3VzIGxpdGVyYXR1cmUgZm9yIG1vZGVsaW5nIHZhbHVlLWF0LXJpc2sgKGRlZmluZWQgYXMgYW4geCUgcXVhbnRpbGUgb2YgYW4gYXNzZXQncyBkYWlseSByZXR1cm5zKSB1c2luZyBub24tbGluZWFyIEFSTUEgdGVybXMgYnkgYWRkaW5nIGV4Y2hhbmdlLXRyYWRlZCBmdW5kcyAoRVRGcykgYXMgZXhwbGFuYXRvcnkgdmFyaWFibGVzIHRoYXQgYXJlIGNvbWJpbmVkIGludG8gcHJpbmNpcGFsIGNvbXBvbmVudCB2ZWN0b3JzIGF0IHRoZSBmb3JlY2FzdCBvcmlnaW4uIENvbWJpbmluZyB0aGVzZSBwcmluY2lwYWwgY29tcG9uZW50IHZlY3RvcnMgd2l0aCB0cmFuc2Zvcm1hdGlvbnMgb2YgbGFnZ2VkIGF1dG9yZWdyZXNzaXZlIHJlc3BvbnNlIHZhcmlhYmxlcyByZXN1bHRzIGluIGEgbW9kZWwgdGhhdCBwcm9kdWNlcyBzaW1pbGFyIHByZWRpY3RpdmUgYWNjdXJhY3kgZHVyaW5nIHBlcmlvZHMgb2YgcmVsYXRpdmVseSBsb3cgdm9sYXRpbGl0eSBhbG9uZyB3aXRoIG1vcmUgaW5zaWdodCBpbnRvIHRoZSBkcml2ZXJzIG9mIHRoZSBjaGFuZ2VzIGluIHRoZSByZXNwb25zZSB2YXJpYWJsZS4gSW4gZmFjdCwgb25lIGluc2lnaHQgZ2FpbmVkIGZyb20gdGhlIG5ldyBtb2RlbCBpcyBhIG1ldGhvZCBvZiBkZXRlY3RpbmcgY2hhbmdlcG9pbnRzIGluIHRoZSBlY29ub215IGJ5IG1lYXN1cmluZyB0aGUgYW5nbGUgYmV0d2VlbiByZXN1bHRhbnQgdmVjdG9ycyBjYWxjdWxhdGVkIGZyb20gdGhlIGNvbWJpbmF0aW9uIG9mIHByaW5jaXBhbCBjb21wb25lbnQgdmVjdG9ycyBkdXJpbmcgZGlmZmVyZW50IHRpbWUgcGVyaW9kcy4gVGhpcyBtZXRob2QsIGFsb25nIHdpdGggYW5hbHlzaXMgb2YgdGhlIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBvZiB0aGUgbGFnZ2VkIEVURnMsIGFsbG93cyBmb3IgaW5zaWdodCBpbnRvIGNoYW5nZXMgaW4gdGhlIHVuZGVybHlpbmcgZWNvbm9teS4KCiMgQmFja2dyb3VuZCBhbmQgSW50cm9kdWN0aW9uCgpXaGVuIG1vZGVsaW5nIGZpbmFuY2lhbCB0aW1lIHNlcmllcywgc2ltcGx5IGNvbnNpZGVyaW5nIHRoZSBtZWFuIGFuZCB0aGUgdmFyaWFuY2UgaXMgaW5zdWZmaWNpZW50IGZvciBhbiBhY2N1cmF0ZSBkZXBpY3Rpb24gb2YgdGhlIHJldHVybnMgLSBzdG9jayByZXR1cm5zIGFyZSB3ZWxsLWtub3duIGZvciBoYXZpbmcgZmF0IHRhaWxzIGFuZCBhcmUgZGlmZmljdWx0IHRvIG1vZGVsIHVzaW5nIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBbQEZhbWExOTY1XS4gSW4gZmFjdCwgbW9kZWxpbmcgYSAxJSBvciBhIDUlIHF1YW50aWxlIG9mIGRhaWx5IHJldHVybnMgaXMgYSBiZXR0ZXIgd2F5IHRvIHVuZGVyc3RhbmQgYW5kIHByZWRpY3Qgd2hhdCBoYXBwZW5zIG9uIHRoZSB3b3JzdCB0cmFkaW5nIGRheXMgYW5kIHRvIGdpdmUgYSBjbGVhcmVyIHBpY3R1cmUgb2Ygd2hhdCBtaWdodCBoYXBwZW4gZHVyaW5nIGEgZG93bnR1cm4uIEluZGVlZCwgZmluYW5jZSB0aGVvcnkgc3VnZ2VzdHMgdGhhdCBhIHByaW1hcnkgcmVhc29uIHdoeSB0aGUgUyZQIDUwMCwgd2hpY2ggaXMgYSBtYXJrZXQtY2FwaXRhbGl6YXRpb24gd2VpZ2h0ZWQgaW5kZXggY29tcG9zZWQgb2YgdGhlIDUwMC1sYXJnZXN0IHB1YmxpY2x5IHRyYWRlZCBjb21wYW5pZXMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIGhhcyBlYXJuZWQgYSA2LjglIGluZmxhdGlvbi1hZGp1c3RlZCBwcmUtdGF4IHJldHVybiB3aXRoIGRpdmlkZW5kIHJlaW52ZXN0bWVudCBmcm9tIEphbnVhcnkgMTg3MSB0aHJvdWdoIEFwcmlsIDIwMjAgW0BQSzIwMTldIGlzIGJlY2F1c2Ugb2YgdGhlIHJpc2sgb2YgYSBzaWduaWZpY2FudCBkb3dudHVybi4gS2VycnkgUGVjaHRlciBhdCBGb3JiZXMgZGVzY3JpYmVzIGl0IGFzIGEgcHJlbWl1bSBmb3IgdGhlIGZhY3QgdGhhdCAic3RvY2tzIGFyZSByaXNraWVyIiBhbmQgIm1vcmUgcHJvbmUgdG8gcHJpY2UgZmx1Y3R1YXRpb25zIGluIHRoZSBzaG9ydCBydW4iIGNvbXBhcmVkIHRvIGxvd2VyIHJpc2sgaW52ZXN0bWVudHMgW0BQZWNodGVyMjAyMF0uIEEgcG9ydGZvbGlvIG1hbmFnZXIgbXVzdCBpbmRlZWQgY29uc2lkZXIgdGhlIGxvbmctcnVuIHBpY3R1cmU7IGEgc21hbGwgZGlmZmVyZW5jZSBpbiB0aGUgYW5udWFsIHJhdGUgb2YgcmV0dXJuIGNhbiBtYWtlIGFuIGVub3Jtb3VzIGRpZmZlcmVuY2UgaW4gdGhlIGVuZGluZyB2YWx1ZSBvZiBpbnZlc3RtZW50cy4gSG93ZXZlciwgZm9jdXNpbmcgZW50aXJlbHkgb24gbG9uZy1ydW4gdmFsdWUgZ2VuZXJhdGlvbiBpcyBub3QgdGhlIG9ubHkgY29uc2lkZXJhdGlvbiBhIHBydWRlbnQgbWFuYWdlciBvdWdodCB0byBtYWtlLiBXaGlsZSBmb3JlY2FzdGluZyBzdG9jayByZXR1cm5zIGluIHRoZSBsb25nLXJ1biBpcyBjaGFsbGVuZ2luZywgdGhlIHBlcmZvcm1hbmNlIG9mIGluZGljZXMgc3VjaCBhcyB0aGUgUyZQIDUwMCwgZGVzcGl0ZSBzZWVtaW5nbHkgZXhpc3RlbnRpYWwgdGhyZWF0cyBzdWNoIGFzIHRoZSBXb3JsZCBXYXJzIGFuZCB0aGUgR3JlYXQgRGVwcmVzc2lvbiwgZG9lcyBnaXZlIHNvbWUgY29uZmlkZW5jZSB0byBpbnZlc3RvcnMgd2hvIHRyeSB0byBmb2N1cyBvbiBsb25nLXJ1biB2YWx1ZSBnZW5lcmF0aW9uLiBJZ25vcmluZyB0aGUgc2hvcnQtcnVuIHJlbWluZHMgb25lIG9mIEpvaG4gTWF5bmFyZCBLZXluZXMnIGZhbW91cyBtYXhpbSB0aGF0IHRoZSAibG9uZyBydW4gaXMgYSBtaXNsZWFkaW5nIGd1aWRlIHRvIGN1cnJlbnQgYWZmYWlycyIgYmVjYXVzZSAiaW4gdGhlIGxvbmcgcnVuIHdlIGFyZSBhbGwgZGVhZCIgW0BLZXluZXMxOTIzXSwgYW5kIG1vcmVvdmVyLCB0aGUgc2hvcnQtcnVuIGltcGFjdCBvZiBhIHN0cmF0ZWd5IGlzIG9mdGVuIG1vcmUgZGlmZmljdWx0IHRvIHVuZGVyc3RhbmQgdGhhbiB0aGUgbG9uZy1ydW4gcmVzdWx0cywgYW5kIHBvdGVudGlhbGx5IG1vcmUgcHJlY2FyaW91cy4gQW4gaW52ZXN0bWVudCBtYW5hZ2VyIHVzaW5nIGZpbmFuY2lhbCBsZXZlcmFnZSB0byBtYWduaWZ5IHJldHVybnMgKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKSBjb3VsZCBiZSBsZWZ0IGluIGRpcmUgc3RyYWl0cyBpZiB0aGVpciBpbnZlc3RtZW50cyBmZWxsIHJhcGlkbHksIGRlc3BpdGUgYSBzb3VuZCBsb25nLXJ1biBzdHJhdGVneS4KCldoaWxlIHRoZXJlIGFyZSBvdGhlciB3YXlzIHRvIHVuZGVyc3RhbmQgYW5kIG1lYXN1cmUgZG93bnNpZGUgcmlzaywgYSBjb21tb25seSBhY2NlcHRlZCBtZXRob2QgaXMgdXNpbmcgdmFsdWUtYXQtcmlzayAoVmFSKS4gVGhlIG1ldHJpYyBpcyB1bmRlcnN0b29kIGFzIGZvbGxvd3M6IGEgb25lLWRheSAxJSBWYVIgb2YgLTEwIG1pbGxpb24gZG9sbGFycyBmb3IgYSBwb3J0Zm9saW8gbWVhbnMgdGhhdCB0aGUgcG9ydGZvbGlvIHdpbGwgbG9zZSBhdCBsZWFzdCAxMCBtaWxsaW9uIG9mIGl0cyB2YWx1ZSBvbiB0aGUgMSUgd29yc3QgdHJhZGluZyBkYXlzLiBBIG1ham9yIGFkdmFudGFnZSBvZiBWYVIgaXMgdGhhdCBpdCBkaXN0aWxscyBhIGRpc3RyaWJ1dGlvbiBvZiByZXR1cm5zIGludG8gb25lIG51bWJlci4gQXMgc3VjaCwgVmFSIGlzIG9mdGVuIHVzZWQgaW4gc3RyZXNzIHRlc3RpbmcgYnkgcmVndWxhdG9yeSBhZ2VuY2llcyBpbiB0aGUgVW5pdGVkIFN0YXRlcywgdGhlIFVuaXRlZCBLaW5nZG9tLCBhbmQgRXVyb3BlIFtASG9sdG9uMjAxNF0uIAoKQSBwb3B1bGFyIGFwcHJvYWNoIHRvIG1vZGVsaW5nIFZhUiBjYWxsZWQgUmlza01ldHJpY3MgW0BMb25nZXJzdGFleTE5OTZdIHdhcyBpbnRyb2R1Y2VkIGJ5IEouUC4gTW9yZ2FuIGluIDE5OTQgYW5kIHJlLXJlbGFzZWQgaW4gMTk5Ni4gVGhlIG1vZGVsIGFzc3VtZWQgdGhhdCBhICJwb3J0Zm9saW8gb3IgYW55IGFzc2V0J3MgcmV0dXJucyBmb2xsb3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uIG92ZXIgdGltZSIgYW5kIHVzZWQgdGhpcyBhbG9uZyB3aXRoIHRoZSAidmFyaWFuY2UtY292YXJpYW5jZSBtZXRob2QiIHRvIGNhbGN1bGF0ZSBWYVIgW0BJbnZlc3RvcGVkaWEyMDE5XS4gV2hpbGUgdGhpcyB3YXMgY2VydGFpbmx5IGEgc3RlcCBmb3J3YXJkIGF0IHRoZSB0aW1lLCBwZXJoYXBzIHRoZSBtb2RlbCdzIGdyZWF0ZXN0IGRvd25mYWxsIGlzIHRoZSBwcmV0ZW5zZSBvZiBrbm93bGVkZ2UgdGhhdCBtb2RlbGluZyB0aGUgZGlzdHJpYnV0aW9uIG9mIHJldHVybnMgaW4gZW50aXJldHkgaXMgcG9zc2libGUuIFRoZSBlbGVnYW50IHNpbXBsaWNpdHkgb2YgdXNpbmcgYSBub3JtYWwgZGlzdHJpYnV0aW9uIGlzIGFwcGVhbGluZyAtIG9ubHkgaGF2aW5nIHRvIGVzdGltYXRlIHRoZSBtZWFuIGFuZCB0aGUgdmFyaWFuY2UgdG8gZ2V0IGEgdW5pdmVyc2FsIHBpY3R1cmUgb2YgcmV0dXJucyBpcyBjZXJ0YWlubHkgYXBwZWFsaW5nLCBhbmQgcGVyaGFwcyBuZWNlc3NhcnkgaW4gYSB0aW1lIG9mIGNvbXBhcmF0aXZlbHkgbGltaXRlZCBjb21wdXRpbmcgcG93ZXIuIAoKSGF2aW5nIHNhaWQgdGhhdCwgbW9kZWxpbmcgdGhlIGJpZyBwaWN0dXJlIHdoaWxlIG1ha2luZyBjbGVhciBhc3N1bXB0aW9ucyBhYm91dCB0aGUgbmF0dXJlIG9mIHJldHVybnMgaGFzIGl0cycgcGVya3MsIGFuZCBpcyBwZXJoYXBzIGFkdmVudGFnb3VzIG92ZXIgYWx0ZW5hdGl2ZXMgZm9yIG1vZGVsaW5nIFZhUi4gSW5kZWVkLCBtYW55IG9mIHRoZSBhcHByb2FjaGVzIGZvciBtb2RlbGluZyBWYVIgcmVseSBvbiBhIHNlbWlwYXJhbWV0cmljIG9yIGEgbm9ucGFyYW1ldHJpYyBoaXN0b3JpY2FsIHNpbXVsYXRpb24gW0BSaWNoYXJkc29uMjAwNV0uIEFjY29yZGluZyB0byBSb2JlcnQgRW5nbGUgYW5kIFNpbW9uZSBNYW5nYW5lbGxpIGluIGEgMjAwNCBwYXBlciwgdGhlc2UgbWV0aG9kcyBhcmUgdXN1YWxseSBjaG9zZW4gZm9yIOKAnGVtcGlyaWNhbCBqdXN0aWZpY2F0aW9ucyByYXRoZXIgdGhhbiBvbiBzb3VuZCBzdGF0aXN0aWNhbCB0aGVvcnnigJ0gW0BFbmdsZTIwMDRdLiBUaGV5IHByb3Bvc2UgYSBmcmFtZXdvcmsgY2FsbGVkIENBVmlhUiB0aGF0IGRpcmVjdGx5IGZvcmVjYXN0cyB0aGUgVmFSIHF1YW50aWxlIHVzaW5nIGEgY29uZGl0aW9uYWwgYXV0b3JlZ3Jlc3NpdmUgcXVhbnRpbGUgc3BlY2lmaWNhdGlvbi4gVGhpcyBhcHByb2FjaCBidWlsZHMgdXBvbiB0aGUgc3RhdGlzdGljYWwgbGl0ZXJhdHVyZSB0aGF0IGV4dGVuZHMgbGluZWFyIHF1YW50aWxlIG1vZGVscyB0byBzZXR0aW5ncyBhbWVuYWJsZSB0byBmaW5hbmNpYWwgbW9kZWxpbmcsIHN1Y2ggYXMgd2l0aCBoZXRlcm9za2VkYXN0aWMgYW5kIG5vbnN0YXRpb25hcnkgZXJyb3IgZGlzdHJpYnV0aW9ucyBbQFBvcnRub3kxOTkxXS4KCiMgTWV0aG9kcyBVc2VkCgpUaGUgYXBwZWFsIG9mIHRoaXMgbW9kZWwgaXMgdGhhdCBpdCBjb21iaW5lcyB0aGUgY3Jpc3Agc3RhdGlzdGljYWwgYXNzdW1wdGlvbnMgd2l0aCB0aGUgZmxleGliaWxpdHkgcmVxdWlyZWQgdG8gbW9kZWwgZmluYW5jaWFsIHJldHVybnMuIEhvd2V2ZXIsIHRoZSBtb2RlbCBzdGlsbCBydW5zIGludG8gaXNzdWVzIHdoZW4gYSB0cmFpbmluZyBzYW1wbGUgaXMgdG90YWxseSB1bnJlcHJlc2VudGF0aXZlIG9mIHRoZSB0ZXN0aW5nIHBlcmlvZCAtIGEgY29tbW9uIHByb2JsZW0gaW4gc3RhdGlzdGljYWwgYW5hbHlzaXMuIEluaXRpYWwgbW90aXZhdGlvbnMgZm9yIHRoaXMgcGFwZXIgaW52b2x2ZWQgYW5hbHl6aW5nIHR3byBzdG9ja3MgLSBBbWF6b24gKHRpY2tlcjogQU1aTikgYW5kIFByb2N0b3IgJiBHYW1ibGUgKHRpY2tlcjogUEcpIGFuZCB0aGVpciBwZXJmb3JtYW5jZSBkdXJpbmcgdGhlIEdyZWF0IFJlY2Vzc2lvbiAoc3BlY2lmaWNhbGx5LCB0aGUgbGFzdCAyMDAgdHJhZGluZyBkYXlzIG9mIDIwMDgpLiBBIHJlbGV2YW50IHF1ZXN0aW9uIG9mIGEgZmluYW5jaWFsIGluc3RpdHV0aW9uIHdvdWxkIHVuZGVyc3RhbmRhYmx5IGJlIGhvdyB0aGVpciByaXNrIG1vZGVsIHBlcmZvcm1lZCBkdXJpbmcgMjAwOCwgYSBoaWdobHkgdm9sYXRpbGUgcGVyaW9kIHdoaWNoIHdhcyBkcml2ZW4gYnkgdGhlICJtb3N0IHNldmVyZSBmaW5hbmNpYWwgY3Jpc2lzIHNpbmNlIHRoZSBHcmVhdCBEZXByZXNzaW9uIiwgYWNjb3JkaW5nIHRvIEdhcnkgQmVja2VyIFtAQmVja2VyMjAwOF0sIGEgTm9iZWwtcHJpemUgd2lubmluZyBlY29ub21pc3QuIEludGVyZXN0aW5nbHksIHRoZSB1bml2YXJpYXRlIENBVmlhUiBmb3JlY2FzdCBmb3IgQW1hem9uIHdhcyBmYWlybHkgYWNjdXJhdGUgd2hlcmVhcyB0aGUgZm9yZWNhc3QgZm9yIFBHIHdhcyBub3QuIE9uZSByZWFzb24gZm9yIHRoaXMgY291bGQgYmUgdGhlIGZhY3QgdGhhdCBhIHN0b2NrIGxpa2UgQW1hem9uIHdhcyBoaWdobHkgdm9sYXRpbGUgZHVyaW5nIHRoZSB0cmFpbmluZyBzYW1wbGUsIHdoaWNoIGluY2x1ZGVkIHJldHVybiBkYXRhIHN0YXJ0aW5nIGZyb20gdGhlIHNlY29uZCBxdWFydGVyIG9mIDIwMDQsIGJ1dCBQRyB3YXMgZmFpcmx5IHN0YWJsZS4gSG93IHdvdWxkIGl0IGJlIHBvc3NpYmxlIGZvciBhIHVuaXZhcmlhdGUgbW9kZWwgc3VjaCBhcyBDQVZpYVIsIHRoYXQgZG9lcyBub3QgZXhwbGljaXRseSBhY2NvdW50IGZvciBvdGhlciBmYWN0b3JzLCB0byBmb3JlY2FzdCB3ZWxsPyBXaGF0IGlmIGEgdm9sYXRpbGUgc3RvY2sgc3VjaCBhcyBBTVpOIHdhcyBpbmNsdWRlZCBpbnRvIHRoZSBmb3JlY2FzdCBmb3IgUEcgLSB3b3VsZCBpdCBpbXByb3ZlIHRoZSBwcmVkaWN0aW9uPwoKYGBge3J9CiMgUmVhZCBpbiByZWxldmFudCBsaWJyYXJpZXMKbGlicmFyeShtaWNyb2JlbmNobWFyaykKbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KHF1YW50bW9kKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodHNlcmllcykKbGlicmFyeSh6b28pCmxpYnJhcnkobWFncml0dHIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShmb3JtYXR0YWJsZSkKbGlicmFyeShxdWFudHJlZykKbGlicmFyeShNVFMpCmxpYnJhcnkocGxvdDNEKQpsaWJyYXJ5KGNpdHIpCmxpYnJhcnkoZm9ybWF0dGFibGUpCgoKIyBTZXQgdXAgd29ya2luZyBkaXJlY3RvcnkKIyBzZXR3ZCgifi9Eb2N1bWVudHMvR2l0SHViL0NhdmlhUiIpCgojIHNvdXJjZSgnY2F2aWFyX1NNLlInKQpzb3VyY2UoJ34vRG9jdW1lbnRzL0dpdEh1Yi9DYXZpYVIvY2F2aWFyX1NNLlInKQpgYGAKCmBgYHtyfQojIENvbXBhcmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBtb2RlbCBydW5zCmFjY19kZiA9IGFzLmRhdGEuZnJhbWUobWF0cml4KDAsIG5yb3cgPTQsIG5jb2wgPSAyKSkKcm93bmFtZXMoYWNjX2RmKSA8LSBjKCJWYVIgRXhjZWVkZWQiLCAiVmFSIE5vdCBFeGNlZWRlZCIsICJWYVIgQnJlYWsgUmF0ZSIsICJUaGVvcmV0aWNhbCBWYVIiKQpjb2xuYW1lcyhhY2NfZGYpIDwtIGMoIkFNWk4iLCAiUEciKQoKIyBMZXQncyBjcmVhdGUgZ3JhcGhzIGZvciB0aGUgQW1hem9uIGRhdGEKZm9yIChpIGluIDEpewogICMgRXhwb3J0IHRoZSBkYXRhCiAgYW16bl9kYXQgPC0gYXMueHRzKHJlYWQuY3N2LnpvbyhmaWxlPXBhc3RlMCgifi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUi9hbXpuX3Jlc3VsdF8iLGksICIuY3N2IiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcj1UUlVFLCBhcy5pcyA9IFRSVUUpKQogIHByaW50KHBsb3QueHRzKGFtem5fZGF0WywxOjJdLCBjb2wgPSBjKCJyZWQiLCAiYmxhY2siKSwgbHR5ID0gYygyLDEpLCBtYWluID0gcGFzdGUwKCJMb2cgUmV0dXJuIGZyb20gQU1aTiBBZGouIENsb3NlIHZzLiBGY3N0LiBWYVIsIFJ1biAiLCBpKSxncmlkLmNvbCA9IE5BLCBsZWdlbmQubG9jID0gImJvdHRvbWxlZnQiKSkKfQoKIyBDYWxjdWxhdGUgdGhlIEFNWk4gZXJyb3IKYW16bl9icmVhY2ggPSBpZmVsc2UoYW16bl9kYXQkQWN0X1JldHVybiA+IGFtem5fZGF0JEZjc3RfVmFSLCAwLCAxKQojIFB1dCB0aGUgZGF0YSBpbnRvIGEgZGF0YSBmcmFtZQphY2NfZGZbMSwxXSA9IHN1bShhbXpuX2JyZWFjaCkKYWNjX2RmWzIsMV0gPSBsZW5ndGgoYW16bl9icmVhY2gpIC0gc3VtKGFtem5fYnJlYWNoKQphY2NfZGZbMywxXSA9IHN1bShhbXpuX2JyZWFjaCkvbGVuZ3RoKGFtem5fYnJlYWNoKQphY2NfZGZbNCwxXSA9IDAuMDEKCiMgTGV0J3MgY3JlYXRlIGdyYXBocyBmb3IgdGhlIFBHIGRhdGEKZm9yIChpIGluIDEpewogICMgSW1wb3J0IHRoZSBkYXRhCiAgcGdfZGF0IDwtIGFzLnh0cyhyZWFkLmNzdi56b28oZmlsZT1wYXN0ZTAoIn4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVIvUEdfcmVzdWx0XyIsaSwgIi5jc3YiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyPVRSVUUsIGFzLmlzID0gVFJVRSkpCiAgcHJpbnQocGxvdC54dHMocGdfZGF0WywxOjJdLCBjb2wgPSBjKCJyZWQiLCAiYmxhY2siKSwgbHR5ID0gYygyLDEpLCBtYWluID0gcGFzdGUwKCJMb2cgUmV0dXJuIGZyb20gUEcgQWRqLiBDbG9zZSB2cy4gRmNzdC4gVmFSLCBSdW4gTnVtYmVyICIsIGkpLGdyaWQuY29sID0gTkEsIGxlZ2VuZC5sb2MgPSAiYm90dG9tbGVmdCIpKQp9CgojIENhbGN1bGF0ZSB0aGUgUEcgZXJyb3IKcGdfYnJlYWNoID0gaWZlbHNlKHBnX2RhdCRBY3RfUmV0dXJuID4gcGdfZGF0JEZjc3RfVmFSLCAwLCAxKQojIFB1dCB0aGUgZGF0YSBpbnRvIGEgZGF0YSBmcmFtZQphY2NfZGZbMSwyXSA9IHN1bShwZ19icmVhY2gpCmFjY19kZlsyLDJdID0gbGVuZ3RoKHBnX2JyZWFjaCkgLSBzdW0ocGdfYnJlYWNoKQphY2NfZGZbMywyXSA9IHN1bShwZ19icmVhY2gpL2xlbmd0aChwZ19icmVhY2gpCmFjY19kZls0LDJdID0gMC4wMQoKCmFjY19kZlstKDE6MiksXSAlPiUga2FibGUoY2FwdGlvbiA9ICJBY2N1cmFjeSBvZiBWYVIgRm9yZWNhc3QgZm9yIFBHIE92ZXIgTGFzdCAyMDAgVHJhZGluZyBEYXlzIGluIDIwMDgiLCBkaWdpdHMgPSAzKSAlPiUga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRikgJT4lIGZvb3Rub3RlKGdlbmVyYWwgPSAiVGVzdGVkIFVzaW5nIHRoZSBTeW1tZXRyaWMgQWJzb2x1dGUgVmFsdWUgTW9kZWwiKQoKYGBgCgoKClRodXMsIHRoZSBpZGVhIG9mIGNvbWJpbmluZyBzdG9ja3MgaW50byBhIG11bHRpdmFyaWF0ZSBzZXR0aW5nIHRvIGNhcHR1cmUgY29ycmVsYXRpb25zIGFuZCBiZXR0ZXIgZm9yZWNhc3QgcmlzayB3YXMgZm9ybWVkLiBBIG5hdHVyYWwgY2hvaWNlIGFwcGVhcmVkIHRvIGJlIHRoZSBkaWZmdXNpb24gaW5kZXggbW9kZWwsIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IFN0b2NrIGFuZCBXYXRzb24gZm9yIHByZWRpY3RpbmcgY29uZGl0aW9uYWwgbWVhbnMgW0BTdG9jazIwMDI7IEBTdG9jazIwMDJhXS4gVGhlIG1vZGVsIGZvciBmb3JlY2FzdGluZyB0aGUgY29uZGl0aW9uYWwgbWVhbiBpcyBzcGVjaWZpZWQgYmVsb3cuCgojIyBEaWZmdXNpb24gSW5kZXggTW9kZWwKCkEgdXNlZnVsIG1lYW5zIG9mIHByZWRpY3Rpbmcgc3RvY2sgbW92ZW1lbnRzIGluIHRoZSBmdXR1cmUgaXMgdGhlIFN0b2NrIGFuZCBXYXRzb24gZGlmZnVzaW9uIGluZGV4LiBUaGUgbW9kZWwgaXMgb3V0bGluZWQgYmVsb3csIHdoaWNoIGlzIGFkYXB0ZWQgZnJvbSBNdWx0aXZhcmlhdGUgVGltZSBTZXJpZXMgQW5hbHlzaXMgV2l0aCBSIGFuZCBGaW5hbmNpYWwgQXBwbGljYXRpb25zIGJ5IFJ1ZXkgUy4gVHNheSBbQFRzYXkyMDE0XS4KClRoZXJlIGFyZSB0d28gcmVsZXZhbnQgZXF1YXRpb25zLCAkXGJvbGRzeW1ib2x7el90fSA9IFxib2xkc3ltYm9se0xmX3R9ICsgXGJvbGRzeW1ib2x7XGVwc2lsb25fdH0kIGFuZCAkeV97dCtofSA9IFxib2xkc3ltYm9se1xiZXRhXlxwcmltZSBmX3R9ICsgXGJvbGRzeW1ib2x7ZV97dCtofX0kLgoKSW4gdGhlIGZpcnN0IGVxdWF0aW9uLCAkXGJvbGRzeW1ib2x7el90fSA9ICh6X3sxdH0sIC4uLi4sIHpfe2t0fSleXHByaW1lJCBpcyBhbiBvYnNlcnZlZCB0aW1lIHNlcmllcyB3aXRoIG1lYW4gMCwgJFxib2xkc3ltYm9se2ZfdH0kIGlzIGFuIG0tZGltZW5zaW9uYWwgdmVjdG9yIG9mIGNvbW1vbiBmYWN0b3JzIHdpdGggbWVhbiAwIGFuZCBpZGVudGl0eSBjb3ZhcmlhbmNlIG1hdHJpeCwgJFxib2xkc3ltYm9se0x9JCBpcyBhICRrIFx0aW1lcyBtJCBsb2FkaW5nIG1hdHJpeCwgYW5kICRcYm9sZHN5bWJvbHtcZXBzaWxvbl90fSQgaXMgYW4gaW5kZXBlbmRlbnQgYW5kIGlkZW50aWNhbGx5IGRpc3RyaWJ1dGVkIChpLmkuZC4pIHNlcXVlbmNlIG9mIHJhbmRvbSB2ZWN0b3JzIHdpdGggbWVhbiAwIGFuZCBjb3ZhcmlhbmNlIG1hdHJpeCAkXGJvbGRzeW1ib2x7XFNpZ21hX2V9JC4KCkluIHRoZSBzZWNvbmQgZXF1YXRpb24sIHdoaWNoIHJlcHJlc2VudHMgdGhlIGgtc3RlcCBhaGVhZCBwcmVkaWN0aW9uIGJhc2VkIG9uICRcYm9sZHN5bWJvbHtmX3R9JCwgJHlfdCQgaXMgdGhlIHNjYWxhciB0aW1lIHNlcmllcyBvZiBpbnRlcmVzdCwgJGgkIGlzIHRoZSBmb3JlY2FzdCBob3Jpem9uLCAkXGJvbGRzeW1ib2x7XGJldGF9JCByZXByZXNlbnRzIHRoZSB2ZWN0b3Igb2YgY29lZmZpY2llbnRzLCBhbmQgJGVfdCQgaXMgYSBzZXF1ZW5jZSBvZiB1bmNvcnJlbGF0ZWQgcmFuZG9tIHZhcmlhYmxlcyB3aXRoIG1lYW4gMCBhbmQgY29uc3RhbnQgdmFyaWFuY2UuIAoKVG8gbW9kZWwgdGhlIGRhdGEsIHByaW5jaXBhbCBjb21wb25lbnQgYW5hbHlzaXMgaXMgcGVyZm9ybWVkIG9uIHRoZSBjb3ZhcmlhdGVzIGRlc2NyaWJlZCBiZWxvdyB0byBvYnRhaW4gYW4gZXN0aW1hdGUgb2YgJFxib2xkc3ltYm9se2ZfdH0kLiBXaGVuIG1vZGVsaW5nIHRoZSBjb25kaXRpb25hbCBtZWFuLCB0aGUgJFxib2xkc3ltYm9se1xiZXRhfSQgY29lZmZpY2llbnRzIGFyZSBlc3RpbWF0ZWQgdXNpbmcgb3JkaW5hcnkgbGVhc3Qgc3F1YXJlcywgaG93ZXZlciBpbiB0aGUgc3BlY2lmaWNhdGlvbiBiZWxvdyB0aGV5IGFyZSBub3QuIEEgc3BlY2lmaWMgZm9ybXVsYXRpb24gbWVudGlvbmVkIGluIHRoZSB0ZXh0Ym9vayBpcyBhcyBmb2xsb3dzLCB3aGVyZSB0aGUgaW5kaXZpZHVhbHMgZGlmZnVzaW9uIGluZGljZXMgYXJlIGdpdmVuIGJ5ICRmX2l0JCwgYW5kIHRoZSBnb2FsIGlzIGEgb25lLXN0ZXAgYWhlYWQgcHJlZGljdGlvbiBvZiAkeV90JDoKCiQkCnlfe3QrMX0gPSBcYmV0YV8wICsgXHN1bV97aT0xfV5tIFxiZXRhX2kgZl97aXR9ICsgZV90LgokJAoKIyMgVW5pdmFyaWF0ZSBDQVZpYVIgTW9kZWwgU3BlY2lmaWNhdGlvbnMKCkhvd2V2ZXIsIHdvcmsgbmVlZGVkIHRvIGJlIGRvbmUgdG8gYWxpZ24gdGhlIGRpZmZ1c2lvbiBpbmRleCBtb2RlbCB3aXRoIHRoZSBDQVZpYVIgbW9kZWwsIHdoaWNoIGlzIGRlZmluZWQgYmVsb3cuIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFyZSByZXF1aXJlZCBmb3IgdXNlIGluIHRoZSBDQVZpYVIgbW9kZWwuIEZvciBlYXNlIG9mIG5vdGF0aW9uLCB0aGVzZSBhcmUgc291cmNlZCBkaXJlY3RseSBmcm9tIHRoZSBFbmdsZSBhbmQgTWFuZ2FuZWxsaSAyMDA0IENBVmlhUiBwYXBlciBbQEVuZ2xlMjAwNF0sIHdpdGggc29tZSBhZGRlZCBkZXNjcmlwdGlvbjoKCi0gJCh5X3QpX3t0PTF9XlQkIGlzIGEgInZlY3RvciBvZiBwb3J0Zm9saW8gcmV0dXJucyIKLSAkXHRoZXRhJCBpcyB0aGUgInByb2JhYmlsaXR5IGFzc29jaWF0ZWQgd2l0aCBWYVIiIChhIDUlIFZhUiB3b3VsZCBtZWFuICRcdGhldGEgPSAwLjA1JCkKLSAkXGJvbGRzeW1ib2x7eF90fSQgaXMgYSAidmVjdG9yIG9mIHRpbWUgJHQkIG9ic2VydmFibGUgdmFyaWFibGVzIgotICRmX3QoXGJvbGRzeW1ib2x7XGJldGF9KSBcZXF1aXYgZl90KFxib2xkc3ltYm9se3hfe3QtMX0sIFxib2xkc3ltYm9se1xiZXRhX1x0aGV0YX19KSQgaXMgdGhlICJ0aW1lICR0IFx0aGV0YSQgcXVhbnRpbGUgb2YgdGhlIGRpc3RyaWJ1dGlvbiBvZiBwb3J0Zm9saW8gcmV0dXJucyBmb3JtZWQgYXQgdGltZSAkdC0xJCIKClRoZSBhdXRob3JzIHRoZW4gZGVzY3JpYmUgYSAiZ2VuZXJpYyBDQVZpYVIgc3BlY2lmaWNhdGlvbiIgYXMgZm9sbG93czoKCiQkCmZfdChcYm9sZHN5bWJvbHtcYmV0YX0pID0gXGJldGFfMCArIFxzdW1fe2k9MX1ecSBcYmV0YV9pIGZfe3QtMX0oXGJvbGRzeW1ib2x7XGJldGF9KSArIFxzdW1fe2o9MX1eciBcYmV0YV9qIGwoXGJvbGRzeW1ib2x7eF97dC1qfX0pCiQkCgpXaGF0IGlzIGludGVyZXN0aW5nIGFib3V0IHRoZSBnZW5lcmFsIHNldHVwIGlzIHRoYXQgdGhlcmUgYXJlIHR3byBtYWluIGNvbXBvbmVudHMgdG8gdGhlIG1vZGVsIC0gbGFnZ2VkIG9ic2VydmVkIHZhcmlhYmxlcyAocmVwcmVzZW50ZWQgYnkgJGwkKSBhbmQgbGFnZ2VkIHZhbHVlcyBvZiB1bmtub3duIHBhcmFtZXRlcnMsIHdoaWNoIGluIHRoZSBzcGVjaWZpY2F0aW9uIGJlbG93IGlzIHVzZWQgYXMgbW92aW5nIGF2ZXJhZ2UgdGVybXMuIEFzIHN1Y2gsIGl0IGlzIHJlYXNvbmFibGUgdG8gZ2VuZXJhbGl6ZSB0aGUgc3BlY2lmaWNhdGlvbnMgYmVsb3cgYXMgbm9ubGluZWFyIEFSTUEgbW9kZWxzIHdoZXJlICR5X3t0LTF9JCB0ZXJtcyByZWZlciB0byBwcmV2aW91cyByZXR1cm5zLCB3aGVyZWFzICRmX3t0LTF9KFxiZXRhXzEpJCB0ZXJtcyByZWZlciB0byBwcmV2aW91cyBwcmVkaWN0aW9ucy4KCgojIyMgQWRhcHRpdmUgQ0FWaWFSIE1vZGVsCgpDb25zaWRlciB0aGUgZm9sbG93aW5nIG1vZGVsOgoKJCQKZl90KFxiZXRhXzEpID0gZl97dC0xfShcYmV0YV8xKSArIFxiZXRhXzFcbGVmdFtcbGVmdCgxKyBcZXhwKEdbeV97dC0xfSAtIGZfe3QtMX0oXGJldGFfMSldKSAgXHJpZ2h0KV57LTF9IC0gXHRoZXRhIFxyaWdodF0gCiQkCgpGb2xsb3dpbmcgRW5nbGUgYW5kIE1hbmdhbmVsbGkncyAyMDA0IHBhcGVyLCB3ZSBjaG9vc2UgJEcgPSAxMCQsIHNvIHRoYXQgaXMgd2hhdCBpcyB1c2VkIGluIHRoZSByZXN1bHRzIHNlY3Rpb24gb2YgdGhpcyBwYXBlci4gVGhlIGF1dGhvcnMgc3RhdGUgdGhlIHJlYXNvbiBmb3IgdGhlIHNlZW1pbmdseSBhcmJpdHJhcnkgY2hvaWNlIGlzIHRoYXQgd2hpbGUgInRoZSBwYXJhbWV0ZXIgRyBpdHNlbGYgY291bGQgYmUgZXN0aW1hdGVkOyBob3dldmVyLCB0aGlzIHdvdWxkIGdvIGFnYWluc3QgdGhlIHNwaXJpdCBvZiB0aGlzIG1vZGVsLCB3aGljaCBpcyBzaW1wbGljaXR5Ii4gUHJldmlvdXMgc2Vuc2l0aXZpdHkgYW5hbHlzaXMgc2hvd2VkIHRoYXQgcnVubmluZyB0aGUgYWRhcHRpdmUgbW9kZWwgd2l0aCAkRyA9IDUkIGRpZCBub3QgbWF0ZXJpYWxseSBhZmZlY3QgdGhlIFZhUiBwcmVkaWN0aW9ucyAtIHRoZSBhY2N1cmFjeSB3YXMgbm90IGNoYW5nZWQuIFdoaWxlIHRoaXMgbW9kZWwgaXMgbm9ubGluZWFyIGluIEcgYW5kIHRvdGFsIHNjYWxlIGludmFyaWFuY2UgaW4gJEckIHdvdWxkIGJlIHN1cnByaXNpbmcgZ2l2ZW4gdGhlIG5vbmxpbmVhciByZWxhdGlvbnNoaXAsIHRoZSBmYWN0IHRoYXQgdGhlIG90aGVyIGZpdHRlZCBwYXJhbWV0ZXJzIGxpa2VseSBhZGp1c3RlZCBpcyBub3Qgc3VycHJpc2luZy4KCiMjIyBTeW1tZXRyaWMgQWJzb2x1dGUgVmFsdWUgQ0FWaWFSIE1vZGVsCgpCZWxvdyBpcyB0aGUgc3ltbWV0cmljIGFic29sdXRlIHZhbHVlIENBVmlhUiBtb2RlbDoKCiQkCmZfdChcYm9sZHN5bWJvbHtcYmV0YX0pID0gXGJldGFfMSArIFxiZXRhXzJmX3t0LTF9KFxib2xkc3ltYm9se1xiZXRhfSkgKyBcYmV0YV8zfHlfe3QtMX18LgokJAoKIyMjIEFzeW1tZXRyaWMgU2xvcGUgQ0FWaWFSIE1vZGVsCgpCZWxvdyBpcyB0aGUgYXN5bW1ldHJpYyBzbG9wZSBDQVZpYVIgbW9kZWw6CgokJApmX3QoXGJvbGRzeW1ib2x7XGJldGF9KSA9IFxiZXRhXzEgKyBcYmV0YV8yZl97dC0xfShcYm9sZHN5bWJvbHtcYmV0YX0pICsgXGJldGFfMyh5X3t0LTF9KV4rICsgXGJldGFfNCh5X3t0LTF9KV4tLgokJAoKIyMjIEluZGlyZWN0IEdBUkNIICgxLDEpIENBVmlhUiBNb2RlbAoKQmVsb3cgaXMgdGhlIEluZGlyZWN0IEdBUkNIICgxLDEpIG1vZGVsOgoKJCQKZl90KFxib2xkc3ltYm9se1xiZXRhfSkgPSAoXGJldGFfMSArIFxiZXRhXzJmX3t0LTF9XjIoXGJvbGRzeW1ib2x7XGJldGF9KSArIFxiZXRhXzN5X3t0LTF9XjIpXnsxLzJ9LgokJAoKIyMgTXVsdGl2YXJpYXRlIENBVmlhUiBNb2RlbCBTcGVjaWZpY2F0aW9ucwoKVGhlIG11bHRpdmFyaWF0ZSBDQVZpYVIgbW9kZWwgdGFrZXMgaW5zcGlyYXRpb24gZnJvbSB0aGUgbW9kZWxzIGRlc2NyaWJlZCBhYm92ZSBpbiBzZXZlcmFsIHNwZWNpZmljYXRpb25zLCBhcyBtZW50aW9uZWQgaW4gdGhlIG9yaWdpbmFsIHNwZWNpZmljYXRpb25zLiBUaGUgZ2VuZXJhbCBtb2RlbCBmb3JtIGxvb2tzIGxpa2UgdGhlIHNwZWNpZmljYXRpb24gYmVsb3c6CgokJApmX3QoXGJvbGRzeW1ib2x7XGJldGF9KSA9IFxiZXRhXzAgK1xzdW1fe2k9MX1ecCBcYmV0YV9pIHlfe3QtaX0gKyBcc3VtX3tqPTF9Xm0gXGJldGFfe2orcH0gZl97aix0LTF9ICsgZV90LgokJAoKQXMgd2l0aCB0aGUgdW5pdmFyaWF0ZSBDQVZpYVIgbW9kZWwsIHRoZSBvYmplY3Qgb2YgaW50ZXJlc3QgaXMgYSAkXHRoZXRhJCBwZXJjZW50aWxlIHJldHVybiBhbmQgdGhlIG1vZGVsIGlzIGZpdCBpdGVyYXRpdmVseSB0byBtaW5pbWl6ZSB0aGUgbG9zcyBmdW5jdGlvbiBvbiB0aGUgdHJhaW5pbmcgZGF0YS4gSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgbm90YWJsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB1bml2YXJpYXRlIG1vZGVsIGFuZCB0aGUgbXVsdGl2YXJpYXRlIG1vZGVsLiBGaXJzdCwgdGhlcmUgYXJlIG5vIG1vdmluZyBhdmVyYWdlIHRlcm1zIChsYWdnZWQgZXJyb3IgdGVybXMpIC0gdGhlIHJlYXNvbmluZyBmb3IgdGhpcyBpcyBiZWNhdXNlIHRoaXMgbW9kZWwgYWltcyBmb3IgYSBjbGVhciBlY29ub21pYyBpbnRlcnByZXRhdGlvbiwgYW5kIGNyaXNwIGludGVycHJldGF0aW9ucyBvZiBNQSBtb2RlbHMgYXJlIGhhcmRlciB0byBjcmVhdGUuIEFsc28sIG1vdmluZyBhdmVyYWdlIG1vZGVscyByZXF1aXJlIHJlY3Vyc2l2ZSBlc3RpbWF0aW9uIHNpbmNlIGVycm9yIHRlcm1zIGFyZSBub3Qgb2JzZXJ2ZWQsIGFuZCBzbyBkZXZlbG9waW5nIGEgbWV0aG9kIHRvIHdvcmsgd2l0aCB0aGVzZSBlcnJvcnMgaW4gYSByb2J1c3QgcmVncmVzc2lvbiBmcmFtZXdvcmsgaXMgY2hhbGxlbmdpbmcuCgpTZWNvbmQsIGluIHNvbWUgb2YgdGhlIHNwZWNpZmljYXRpb25zIGJlbG93LCB0aGVyZSBhcmUgbGFnZ2VkIHJldHVybiB2YXJpYWJsZXMuIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgdW5pdmFyaWF0ZSBDQVZpYVIgc3BlY2lmaWNhdGlvbiwgdGhvdWdoIHRoZXJlIGlzIG9mdGVuIG1vcmUgdGhhbiAxIGxhZyBhcyBpbiB0aGUgdW5pdmFyaWF0ZSBtb2RlbCAtIHRoZXJlIGFyZSAkcCQgbGFncyBpbiB0aGUgZGF0YXNldC4gVGhpcmQsIGluIGFsbCBvZiB0aGUgc3BlY2lmaWNhdGlvbnMgYmVsb3csIHRoZXJlIGFyZSAkbSQgZGlmZnVzaW9uIGluZGljZXMgdXNlZCBpbiBlYWNoIG1vZGVsIGxhZ2dlZCBieSBvbmUgdGltZSBzdGVwIHRvIGF2b2lkIGxvb2stYWhlYWQgYmlhcy4KCgojIyMgTXVsdGl2YXJpYXRlIENBVmlhUjogTm8gTGFncyBNb2RlbAoKJCQKZl90KFxib2xkc3ltYm9se1xiZXRhfSkgPSBcYmV0YV8wICtcc3VtX3tqPTF9Xm0gXGJldGFfe2p9IGZfe2osdC0xfSArIGVfdAokJAoKIyMjIE11bHRpdmFyaWF0ZSBDQVZpYVIgd2l0aCBBdXRvcmVncmVzc2l2ZSBUZXJtcyBBZGRlZAoKJCQKZl90KFxib2xkc3ltYm9se1xiZXRhfSkgPSBcYmV0YV8wICtcc3VtX3tpPTF9XnAgXGJldGFfaSB5X3t0LWl9ICsgXHN1bV97aj0xfV5tIFxiZXRhX3tqK3B9IGZfe2osdC0xfSArIGVfdAokJAoKIyMjIE11bHRpdmFyaWF0ZSBDQVZpYVIgd2l0aCBTeW1tZXRyaWMgQWJzb2x1dGUgVmFsdWUgQXV0b3JlZ3Jlc3NpdmUgVGVybXMgQWRkZWQKCiQkCmZfdChcYm9sZHN5bWJvbHtcYmV0YX0pID0gXGJldGFfMCArXHN1bV97aT0xfV5wIFxiZXRhX2kgfHlfe3QtaX18ICsgXHN1bV97aj0xfV5tIFxiZXRhX3tqK3B9IGZfe2osdC0xfSArIGVfdAokJAoKIyMjIE11bHRpdmFyaWF0ZSBDQVZpYVIgd2l0aCBBc3ltbWV0cmljIFNsb3BlIEF1dG9yZWdyZXNzaXZlIFRlcm1zIEFkZGVkCgokJApmX3QoXGJvbGRzeW1ib2x7XGJldGF9KSA9IFxiZXRhXzAgK1xzdW1fe2k9MX1ecCBcYmV0YV9pICh5X3t0LWl9KV8rICsgXHN1bV97aj1wKzF9XnsycH0gXGJldGFfaSAoeV97dC1pfSlfLSArIFxzdW1fe2s9MX1ebSBcYmV0YV97aysycH0gZl97ayx0LTF9ICsgZV90CiQkCgoKIyMgRml0dGluZyB0aGUgTW9kZWxzCgpUbyBmaXQgdGhlIG1vZGVscywgYW4gb3B0aW1hbCB2YWx1ZSBvZiAkbSQgZGlmZnVzaW9uIGluZGljZXMgYW5kICRwJCBhdXRvcmVncmVzc2l2ZSB0ZXJtcyBhcmUgYWRkZWQgKG9yICQycCQgaW4gdGhlIGNhc2Ugb2YgdGhlIGFzeW1tZXRyaWMgc2xvcGUgbW9kZWwpLiBUaGUgb3B0aW1hbCB2YWx1ZXMgb2YgdGhlc2UgcGFyYW1ldGVycyBhcmUgZGV0ZXJtaW5lZCB1c2luZyBhIHZhbGlkYXRpb24gZGF0YXNldC4gSW4gYWxsIG9mIHRoZSBydW5zIGJlbG93LCB0aGVyZSBhcmUgYSB0b3RhbCBvZiA1IHllYXJzIG9mIHRyYWRpbmcgZGF5cywgb3IgYWJvdXQgMSwyNjAgZGF5cyBhc3N1bWluZyAyNTIgdHJhZGluZyBkYXlzIGEgeWVhci4gVGhlIGFkanVzdGVkIGNsb3NpbmcgcHJpY2VzIGFyZSBsb2dnZWQgYW5kIGRpZmZlcmVuY2VkLCBzaG9ydGVuaW5nIHRoZSBkYXRhc2V0IGJ5IG9uZS4gQWZ0ZXIgZG9pbmcgdGhpcywgdGhlIGxhc3QgMjUwIGRhdGEgcG9pbnRzIGFyZSByZXNlcnZlZCBhcyB0ZXN0IGRhdGEsIGFuZCB0aGUgMjUwIGRhdGEgcG9pbnRzIGJlZm9yZSB0aGF0IGFyZSB1c2VkIGFzIGEgdmFsaWRhdGlvbiBzZXQuIE1lYXN1cmVkIGJ5IHRoZSBsb3NzIGZ1bmN0aW9uIHdyaXR0ZW4gb3V0IGJlbG93LCB0aGUgdmFsdWVzIG9mICRwJCBhbmQgJG0kIHRoYXQgbWluaW1pemUgbG9zc2VzIGFyZSBjaG9zZW4gYW5kIHRoZSBvcHRpbWFsIG1vZGVsIGlzIHJlZml0IG92ZXIgYm90aCB0aGUgdHJhaW5pbmcgYW5kIHRoZSB2YWxpZGF0aW9uIGRhdGEgY29tYmluZWQgYW5kIHRoZW4gZXZhbHVhdGVkIG9uIHRoZSB0ZXN0IGRhdGEuIE5vdGUgdGhhdCB0aGVyZSBpcyBhbiBvcHRpbWFsIG1vZGVsIGlzIGNob3NlbiBmb3IgZWFjaCBvZiB0aGUgZm91ciBtdWx0aXZhcmlhdGUgQ0FWaWFSIHNwZWNpZmljYXRpb25zIGRlc2NyaWJlZCBhYm92ZSwgc28gdGhlcmUgYXJlIDQgb3B0aW1hbCBzZXRzIG9mICRwJCBhbmQgJG0kIGNob3NlbiBmb3IgZWFjaCBzZXQgb2YgbW9kZWwuIFRodXMsIHRoZXJlIGFyZSA4IG1vZGVscyBjb21wYXJlZCBvbiB0aGUgdGVzdCBkYXRhIC0gNCB1bml2YXJpYXRlIENBVmlhUiBtb2RlbHMgYW5kIDQgbXVsdGl2YXJpYXRlIENBVmlhUiBtb2RlbHMuCgpGcm9tIHRoZSBDQVZpYVIgcGFwZXIsIHRoZSAkXHRoZXRhJHRoIHJlZ3Jlc3Npb24gcXVhbnRpbGUgaXMgZGVmaW5lZCBhcyBhbnkgJFxib2xkc3ltYm9se1xoYXR7XGJldGF9fSQgdGhhdCBzb2x2ZXMgdGhlIGZvbGxvd2luZyBsb3NzIGZ1bmN0aW9uOgoKJCQKXG92ZXJzZXR7YXJnbWlufVxiZXRhIFxmcmFjezF9e1R9XHN1bV97dD0xfV5UIFtcdGhldGEgLSBJKHlfdCA8IGZfdChcYm9sZHN5bWJvbHtcYmV0YX0pKV1beV90IC0gZl90KFxib2xkc3ltYm9se1xiZXRhfSldCiQkCgojIFRoZW9yZXRpY2FsIEd1YXJhbnRlZXMgb2YgQ29uc2lzdGVuY3kgYW5kIEFzeW1wdG90aWMgTm9ybWFsaXR5CgpQYXJ0IG9mIHRoZSByZWFzb24gZm9yIHdvcmtpbmcgd2l0aCB0aGUgQ0FWaWFSIGFuZCBkaWZmdXNpb24gaW5kZXggaXMgdGhlaXIgc3Ryb25nIHRoZW9yZXRpY2FsIGd1YXJhbnRlZXMgYWJvdXQgY29uc2lzdGVuY3kgYW5kIGFzeW1wdG90aWNhbGx5LiBJbmRlZWQsIGZvbGxvd2luZyB0aGUgcmVzdWx0cyBpbiBFbmdsZSBhbmQgTWFuZ2FuZWxsaSBbQEVuZ2xlMjAwNF0sIHRoZXJlIGFyZSA4IGNvbmRpdGlvbnMgcmVxdWlyZWQgZm9yIGNvbnNpc3RlbmN5IG9mIHRoZSAkXGJldGEkIGVzdGltYXRlIGFuZCA0IHJlcXVpcmVkIGZvciBhc3ltcHRvdGljIG5vcm1hbGl0eS4gVGhlIHBhcGVyIHN0YXRlcyB0aGF0IHRoZSBtb2RlbCBzcGVjaWZpZWQgYnk6CgokJAp5X3QgPSBmKHlfe3QtMX0sIFxib2xkc3ltYm9se3h9X3t0LTF9LC4uLiwgeV8xLCBcYm9sZHN5bWJvbHt4fV8xOyBcYm9sZHN5bWJvbHtcYmV0YX1eMCkgKyBcZXBzaWxvbl97dCBcdGhldGF9IFtRdWFudF9cdGhldGEgKFxlcHNpbG9uX3t0IFx0aGV0YX0gfCBcT21lZ2FfdCkgPSAwXQokJAokJApcZXF1aXYgZl90KFxib2xkc3ltYm9se1xiZXRhXjB9KSArIFxlcHNpbG9uX3t0IFx0aGV0YX0sIHQgPSAxLC4uLixUCiQkCgoid2hlcmUgJGZfMShcYm9sZHN5bWJvbHtcYmV0YV4wfSkkIGlzIHNvbWUgZ2l2ZW4gaW5pdGlhbCBjb25kaXRpb24sICRcYm9sZHN5bWJvbHt4X3R9JCBpcyBhIHZlY3RvciBvZiBleG9nZW5vdXMgb2YgcHJlZGV0ZXJtaW5lZCB2YXJpYWJsZXMsICRcYm9sZHN5bWJvbHtcYmV0YV4wfSBcaW4gXG1hdGhiYntSfV5wJCBpcyB0aGUgdmVjdG9yIG9mIHRydWUgdW5rbm93biBwYXJhbWV0ZXJzIHRoYXQgbmVlZCB0byBiZSBlc3RpbWF0ZWQsIGFuZCAkXE9tZWdhX3QgPSBbeV97dC0xfSwgXGJvbGRzeW1ib2x7eH1fe3QtMX0sLi4uLHlfMSwgXGJvbGRzeW1ib2x7eH1fMTsgZl8xIChcYm9sZHN5bWJvbHtcYmV0YX1eMCldJCBpcyB0aGUgaW5mb3JtYXRpb24gc2V0IGF2YWlsYWJsZSBhdCB0aW1lICR0JCIsIGFuZCAkXGJvbGRzeW1ib2x7XGhhdHtcYmV0YX19JCBpcyB0aGUgcGFyYW10ZXIgdmVjdG9yIHRoYXQgbWluaW1pemVzIHRoZSBsb3NzIGZ1bmN0aW9uIHNwZWNpZmllZCBhYm92ZS4gQWNjb3JkaW5nIHRvIHRoZW9yZW1zIGluIHRoZSBwYXBlciwgdGhleSBzdGF0ZSB0aGF0IHVuZGVyIGZhdm9yYWJsZSBjb25kaXRpb25zLCAkXGJvbGRzeW1ib2x7XGhhdHtcYmV0YX19JCBpcyBjb25zaXN0ZW50IGFuZCBhc3ltcHRvdGljYWxseSBub3JtYWwuIAoKIyMgQ29uc2lzdGVuY3kKClBlciBFbmdsZSBhbmQgTWFuZ2FuZWxsaSwgdW5kZXIgdGhlIG1vZGVsIHNwZWNpZmllZCBhYm92ZSBhbmQgdXNpbmcgOCBhc3N1bXB0aW9ucyBnaXZlbiBiZWxvdywgJFxib2xkc3ltYm9se1xoYXR7XGJldGF9fSBcb3ZlcnNldHtwfVxyaWdodGFycm93IFxib2xkc3ltYm9se1xiZXRhXjB9JCB3aGVyZSAkXGJvbGRzeW1ib2x7XGhhdHtcYmV0YX19JCBpcyB0aGUgcGFyYW10ZXIgdmVjdG9yIHRoYXQgbWluaW1pemVzIHRoZSBsb3NzIGZ1bmN0aW9uIHNwZWNpZmllZCBhYm92ZS4gVGhlcmUgYXJlIDggYXNzdW1wdGlvbnMgbGlzdGVkIGluIHRoZSBwYXBlcjsgbW9zdCBzZWVtIGZhaXJseSBzdGFuZGFyZC4KCjEuICIkKFxPbWVnYSwgRiwgUCkkIGlzIGEgY29tcGxldGUgcHJvYmFiaWxpdHkgc3BhY2UsIGFuZCB7JFxlcHNpbG9uX3t0IFx0aGV0YX0kLCAkXGJvbGRzeW1ib2x7eH1fdCR9LCB0ID0gMSwyLC4uLi4gYXJlIHJhbmRvbSB2ZWN0b3JzIG9uIHRoaXMgc3BhY2UiCjIuICJUaGUgZnVuY3Rpb24gJGZfdChcYm9sZHN5bWJvbHtcYmV0YX0pOiBcbWF0aGJie1J9XntrX3R9IFx0aW1lcyAgQiBccmlnaHRhcnJvdyBcbWF0aGJie1J9JCBpcyBzdWNoIHRoYXQgZm9yIGVhY2ggJFxib2xkc3ltYm9se1xiZXRhfSBcaW4gQiQsIGEgY29tcGFjdCBzdWJzZXQgb2YgJFxtYXRoYmJ7Un1ecCwgZl90KFxib2xkc3ltYm9se1xiZXRhfSkkIGlzIG1lYXN1cmFibGUgd2l0aCByZXNwZWN0IHRvIHRoZSBpbmZvcm1hdGlvbiBzZXQgJFxPbWVnYV90JCBhbmQgJGZfdChcY2RvdCkkIGlzIGNvbnRpbnVvdXMgaW4gJEIkLCAkdCA9IDEsMiwuLi4uLCQgZm9yIGEgZ2l2ZW4gY2hvaWNlIG9mIGV4cGxhbmF0b3J5IHZhcmlhYmxlcyB7JHlfe3QtMX0sIFxib2xkc3ltYm9se3h9X3t0LTF9LCAuLi4sIHlfezF9LCBcYm9sZHN5bWJvbHt4fV97MX0kfS4iCjMuICJDb25kaXRpb25hbCBvbiBhbGwgb2YgdGhlIHBhc3QgaW5mb3JtYXRpb24gJFxPbWVnYV90JCwgdGhlIGVycm9yIHRlcm1zICRcZXBzaWxvbl97dCBcdGhldGF9JCBmb3JtIGEgc3RhdGlvbmFyeSBwcm9jZXNzLCB3aXRoIGNvbnRpbnVvdXMgY29uZGl0aW9uYWwgZGVuc2l0eSAkaF90KFxlcHNpbG9uIHwgXE9tZWdhX3QpJC4iCjQuICJUaGVyZSBleGlzdHMgJGggPiAwJCBzdWNoIHRoYXQgZm9yIGFsbCAkdCwgaF90KDAgfCBcT21lZ2FfdCkgXGdlcSBoJC4iCjUuICJ8JGZfdChcYm9sZHN5bWJvbHtcYmV0YX0pJHwgPCAkSyhcT21lZ2FfdCkkIGZvciBlYWNoICRcYm9sZHN5bWJvbHtcYmV0YX0gXGluIEIkIGFuZCBmb3IgYWxsICR0JCwgd2hlcmUgJEsoXE9tZWdhX3QpJCBpcyBzb21lIChwb3NzaWJseSkgc3RvY2hhc3RpYyBmdW5jdGlvbiBvZiB2YXJpYWJsZXMgdGhhdCBiZWxvbmcgdG8gdGhlIGluZm9ybWF0aW9uIHNldCwgc3VjaCB0aGF0ICRcbWF0aGJie0V9KHxLKFxPbWVnYV90KXwpIFxsZXEgS18wIDwgXGluZnR5JCwgZm9yIHNvbWUgY29uc3RhbnQgJEtfMCQiCjYuICIkXG1hdGhiYntFfVt8XGVwc2lsb25fe3RcdGhldGF9fF0gPCBcaW5mdHkkIGZvciBhbGwgJHQkIgo3LiAieyRbXHRoZXRhIC0gSSh5X3QgPCBmX3QoXGJvbGRzeW1ib2x7XGJldGF9KSldWyh5X3QgLSBmX3QoXGJvbGRzeW1ib2x7XGJldGF9KSldJH0gb2JleXMgdGhlIHVuaWZvcm0gbGF3IG9mIGxhcmdlIG51bWJlcnMiCjguICJGb3IgZXZlcnkgJFx4aSA+IDAkLCB0aGVyZSBleGl0cyBhICRcdGF1ID4gMCQgc3VjaCB0aGF0IGlmIHx8JFxib2xkc3ltYm9se1xiZXRhfSA9IFxib2xkc3ltYm9se1xiZXRhfV4wJHx8ICRcZ2VxIFx4aSQsIHRoZW4gJFxsaW0gXGluZl97VCBccmlnaHRhcnJvdyBcaW5mdHl9IFReey0xfSBcU2lnbWEgUFt8Zl90KFxib2xkc3ltYm9se1xiZXRhfSkgLSBmX3QoXGJvbGRzeW1ib2x7XGJldGFeMH0pfCA+IFx0YXVdID4wJCIKCldoZW4gYW5hbHl6aW5nIHJlYWwgZGF0YSwgaXQncyBoYXJkIHRvIHZlcmlmeSBhbnkgYXNzdW1wdGlvbnMgZXhhY3RseSwgYnV0IG9uZSB0aGF0IGlzIG1vc3QgY29udHJvdmVyc2lhbCBtaWdodCBiZSB0aGUgdGhpcmQgYXNzdW1wdGlvbiAtIGluZGVlZCwgaXQgc2VlbXMgaGlnaGx5IHVubGlrZWx5IHRoYXQgZ2l2ZW4gYWxsIHRoZSBwYXN0IGluZm9ybWF0aW9uLCB0aGVyZSB3b3VsZCBiZSBhIHN0YXRpb25hcnkgcHJvY2Vzcy4KCiMjIEFzeW1wdG90aWMgTm9ybWFsaXR5CgpBbHNvIHBlciBFbmdsZSBhbmQgTWFuZ2FuZWxsaSwgdW5kZXIgdGhlIHNhbWUgYXNzdW1wdGlvbnMgcmVxdWlyZWQgZm9yIGNvbnNpc3RlbmN5IGFzIHdlbGwgYXMgdGhlIGFzc3VtcHRpb25zIGJlbG93LCB0aGVyZSBpcyBhIGd1YXJhbnRlZSBvZiBhc3ltcHRvdGljIG5vcm1hbGl0eToKCiQkClxzcXJ0e1R9IFxib2xkc3ltYm9se0F9X1Reey0xLzJ9XGJvbGRzeW1ib2x7RH1fVCAoXGJvbGRzeW1ib2x7XGhhdHtcYmV0YX19IC0gXGJvbGRzeW1ib2x7XGJldGF9XjApIFxvdmVyc2V0e2R9XHJpZ2h0YXJyb3cgXG1hdGhjYWx7Tn0oMCwgXGJvbGRzeW1ib2x7SX0pCiQkCgp3aGVyZQoKJCQKXGJvbGRzeW1ib2x7QX1fVCBcZXF1aXYgXG1hdGhiYntFfSBcbGVmdFtUXnstMX0gXHRoZXRhICgxLVx0aGV0YSkgXHN1bV97dD0xfV5UIFxuYWJsYScgZl90KFxib2xkc3ltYm9se1xiZXRhfV4wKSBcbmFibGEgZl90KFxib2xkc3ltYm9se1xiZXRhfV4wKSBccmlnaHRdCiQkCgphbmQKCiQkClxib2xkc3ltYm9se0R9X1QgXGVxdWl2IFxtYXRoYmJ7RX0gXGxlZnRbVF57LTF9ICBcc3VtX3t0PTF9XlQgaF90KDB8XE9tZWdhX3QpXG5hYmxhJyBmX3QoXGJvbGRzeW1ib2x7XGJldGF9XjApIFxuYWJsYSBmX3QoXGJvbGRzeW1ib2x7XGJldGF9XjApIFxyaWdodF0KJCQKClRoZXJlIGFyZSA0IGFzc3VtcHRpb25zIGxpc3RlZCBpbiB0aGUgcGFwZXIgcmVxdWlyZWQgZm9yIGFzeW1wdG90aWMgbm9ybWFsaXR5IHRvIGhvbGQuIEFzIHdpdGggdGhlIGFzc3VtcHRpb25zIHJlcXVpcmVkIGZvciBjb25zaXN0ZW5jeSwgdGhlc2Ugc2VlbSBmYWlybHkgc3RhbmRhcmQgYXMgd2VsbDoKCjEuICIkZl90IChcYm9sZHN5bWJvbHtcYmV0YX0pJCBpcyBkaWZmZXJlbnRpYWJsZSBpbiAkQiQgYW5kIGZvciBhbGwgJFxib2xkc3ltYm9se1xiZXRhfSQgYW5kICRcYm9sZHN5bWJvbHtcZ2FtbWF9JCBpbiBhIG5laWdoYm9yaG9vZCAkXG51XzAkIG9mICRcYm9sZHN5bWJvbHtcYmV0YV4wfSQsIHN1Y2ggdGhhdCAkfHxcYm9sZHN5bWJvbHtcYmV0YX0gLSBcYm9sZHN5bWJvbHtcZ2FtbWF9fHwgXGxlcSBkJCBmb3IgJGQkIHN1ZmZpY2llbnRseSBzbWFsbCBhbmQgZm9yIGFsbCAkdCQ6IgphLiAiJHx8XG5hYmxhIGZfdCAoXGJvbGRzeW1ib2x7XGJldGF9KXx8IFxsZXEgRihcT21lZ2FfdCkkLCB3aGVyZSAkRihcT21lZ2FfdCkkIGlzIHNvbWUgKHBvc3NpYmx5KSBzdG9jaGFzdGljIGZ1bmNpdG9uIG9mIHZhcmlhYmxlcyB0aGF0IGJlbG9uZyB0byB0aGUgaW5mb3JtYXRpb24gc2V0IGFuZCAkXG1hdGhiYntFfShGKFxPbWVnYV90KV4zKSBcbGVxIEZfMCA8IFxpbmZ0eSQsIGZvciBzb21lIGNvbnN0YW50ICRGXzAkLiIKYi4gIiR8fFxuYWJsYSBmX3QgKFxib2xkc3ltYm9se1xiZXRhfSktIFxuYWJsYSBmX3QgKFxib2xkc3ltYm9se1xnYW1tYX0pfHwgXGxlcSBNKFxPbWVnYV90LCBcYm9sZHN5bWJvbHtcYmV0YX0sIFxib2xkc3ltYm9se1xnYW1tYX0pID0gXG1hdGhjYWx7T30ofHxcYm9sZHN5bWJvbHtcYmV0YX0gLSBcYm9sZHN5bWJvbHtcZ2FtbWF9fHwpJCwgd2hlcmUgJE0oXE9tZWdhX3QsIFxib2xkc3ltYm9se1xiZXRhfSwgXGJvbGRzeW1ib2x7XGdhbW1hfSkkIGlzIHNvbWUgZnVuY3Rpb24gc3VjaCB0aGF0ICRcbWF0aGJie0V9W00oXE9tZWdhX3QsIFxib2xkc3ltYm9se1xiZXRhfSwgXGJvbGRzeW1ib2x7XGdhbW1hfSldXjIgXGxlcSBNXzB8fFxib2xkc3ltYm9se1xiZXRhfSAtIFxib2xkc3ltYm9se1xnYW1tYX18fCA8IFxpbmZ0eSQgYW5kICRcbWF0aGJie0V9W00oXE9tZWdhX3QsIFxib2xkc3ltYm9se1xiZXRhfSwgXGJvbGRzeW1ib2x7XGdhbW1hfSldRihcT21lZ2FfdCldIFxsZXEgTV8xfFxib2xkc3ltYm9se1xiZXRhfSAtIFxib2xkc3ltYm9se1xnYW1tYX18fCA8IFxpbmZ0eSQgZm9yIHNvbWUgY29uc3RhbnRzICRNXzAkIGFuZCAkTV8xJC4iCjJhLiAiJGgoXGVwc2lsb258XE9tZWdhX3QpIFxsZXEgTiA8IFxpbmZ0eSBcdGV4dHsgfSBcZm9yYWxsIHQkLCBmb3Igc29tZSBjb25zdGFudCAkTiQuIgpiLiAiJGgoXGVwc2lsb258XE9tZWdhX3QpJCBzYXRpc2ZpZXMgdGhlIExpcHNjaGl0eiBjb25kaXRpb24gJHxoX3QoXGxhbWJkYV8xIHwgXE9tZWdhX3QpIC0gaF90KFxsYW1iZGFfMiB8IFxPbWVnYV90KXwgXGxlcSBMfFxsYW1iZGFfMSAtIFxsYW1iZGFfMnwkIGZvciBzb21lIGNvbnN0YW50ICRMIDwgXGluZnR5IFx0ZXh0eyB9IFxmb3JhbGwgdCQuIgozLiAiVGhlIG1hdHJpY2VzICRcYm9sZHN5bWJvbHtBfV9UIFxlcXVpdiBcbWF0aGJie0V9IFxsZWZ0W1Reey0xfSBcdGhldGEgKDEtXHRoZXRhKSBcc3VtX3t0PTF9XlQgXG5hYmxhJyBmX3QoXGJvbGRzeW1ib2x7XGJldGF9XjApIFxuYWJsYSBcdGltZXMgZl90KFxib2xkc3ltYm9se1xiZXRhfV4wKSBccmlnaHRdJCBhbmQgJFxib2xkc3ltYm9se0R9X1QgXGVxdWl2IFxtYXRoYmJ7RX0gXGxlZnRbVF57LTF9ICBcc3VtX3t0PTF9XlQgaF90KDB8XE9tZWdhX3QpXG5hYmxhJyBmX3QoXGJvbGRzeW1ib2x7XGJldGF9XjApIFx0aW1lcyBcbmFibGEgZl90KFxib2xkc3ltYm9se1xiZXRhfV4wKSBccmlnaHRdJCBoYXZlIHRoZSBzbWFsbGVzIGVpZ2VudmFsdWVzIGJvdW5kZWQgYmVsb3cgYnkgYSBwb3NpdGl2ZSBjb25zdGFudCAkVCQgZm9yIHN1ZmZpY2llbnRseSBsYXJnZS4iCjQuICJUaGUgc2VxdWVuY2UgeyRUXnstMS8yfSBcc3VtX3t0PTF9XlRbXHRoZXRhIC0gSSh5X3QgPCBmX3QoXGJvbGRzeW1ib2x7XGJldGF9XjApKV0gXG5hYmxhJ2ZfdChcYm9sZHN5bWJvbHtcYmV0YX1eMCkkfSBvYmV5cyB0aGUgY2VudHJhbCBsaW1pdCB0aGVvcmVtLgoKQXMgd2l0aCB0aGUgY29uc2lzdGVuY3kgY29uZGl0aW9ucywgdGhlc2Ugc2VlbSByZWFzb25hYmxlIGVub3VnaCAtIHRoZSBkYXRhIGNvbnNpZGVyZWQgaW4gdGhpcyBhbmFseXNpcyBzZWVtcyB3ZWxsLWJlaGF2ZWQgZW5vdWdoIHN1Y2ggdGhhdCB0aGVzZSBjb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQuCgoKCiMgRGF0YSBVc2VkCgpUaGUgcmVzcG9uc2UgdmFyaWFibGUgdXNlZCBpbiB0aGlzIGFuYWx5c2lzIGlzIFNQWSwgd2hpY2ggaXMgYW4gZXhjaGFuZ2UtdHJhZGVkIGZ1bmQgdGhhdCBhaW1zIHRvIHRyYWNrIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgUyZQIDUwMCwgd2hpY2ggaXMgZGlzY3Vzc2VkIGFib3ZlLiBJdCBpcyBicm9hZGx5IHVzZWQgYXMgYSBiZWxsd2V0aGVyIG9mIHRoZSBVLlMuIGVjb25vbXksIGFuZCBoYXMgdGhlIGFkdmFudGFnZSBvZiBhdm9pZGluZyBzdXJ2aXZvcnNoaXAgYmlhcyAtIHdoaWxlIGFuIGluZGl2aWR1YWwgc3RvY2sgbWlnaHQgZ28gYmFua3J1cHQgb3IgbWVyZ2Ugd2l0aCBhbm90aGVyLCBpdCBpcyByZWFzb25hYmxlIHRvIGFzc3VtZSB0aGF0IHRoZXNlIGlzc3VlcyBkbyBub3QgYXBwbHkgd2l0aCBhbiBFVEYuIAoKRm9sbG93aW5nIHRoaXMgbG9naWMsIHRoZXJlIGFyZSBzZXZlcmFsIGNsYXNzZXMgb2YgcmVzcG9uc2UgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBhbmFseXNpcy4gVGhlIGZpcnN0IGdyb3VwIGlzIGEgc2V0IG9mIFUuUy4gc2VjdG9yIEVURnMgb2J0YWluZWQgZnJvbSBTZWVraW5nIEFscGhhIFtAU2Vla2luZ0FscGhhMjAyMF0uIEFzIHdpdGggdGhlIHJlc3BvbnNlIHZhcmlhYmxlLCB0aGVzZSBFVEZzIHdlcmUgcHVibGljbHkgdHJhZGVkIHRocm91Z2hvdXQgdGhlIEdyZWF0IFJlY2Vzc2lvbiBvZiAyMDA4LgoKYS4gVXRpbGl0aWVzIChYTFUpCmIuIENvbnN1bWVyIFN0YXBsZXMgKFhMUCkKYy4gSGVhbHRoY2FyZSAoWExWKQpkLiBUZWNobm9sb2d5IChYTEspCmUuIENvbnN1bWVyIERpc2NyZXRpb25hcnkgKFhMWSkKZi4gSW5kdXN0cmlhbCAoWExJKQpnLiBGaW5hbmNpYWwgU2VydmljZXMgKFhMRikKaC4gQmFzaWMgTWF0ZXJpYWxzIChYTEIpCmkuIEVuZXJneSAoWExFKQoKVGhlIHNlY29uZCBncm91cCBpcyBHbG9iYWwgU2VjdG9yIEVURnMsIGFsc28gZnJvbSBTZWVraW5nIEFscGhhIFtAU2Vla2luZ0FscGhhMjAyMF0uIFRoZSByYXRpb25hbGUgZm9yIGluY2x1ZGluZyB0aGVzZSBpcyB0aGF0IHBlcmhhcHMgc29tZSBnbG9iYWwgZXhwb3N1cmUgaXMgdXNlZnVsIGluIHVuZGVyc3RhbmRpbmcgdGhlIGJyb2FkZXIgbWFya2V0LgoKYS4gVXRpbGl0aWVzIChKWEkpCmIuIENvbnN1bWVyIFN0YXBsZXMgKEtYSSkKYy4gSGVhbHRoY2FyZSAoSVhKKQpkLiBUZWxlY29tbXVuaWNhdGlvbnMgKElYUCkKZS4gVGVjaG5vbG9neSAoSVhOKQpmLiBDb25zdW1lciBEaXNjcmV0aW9uYXJ5IChSWEkpCmcuIEluZHVzdHJpYWwgKEVYSSkKaC4gRmluYW5jaWFsIFNlcnZpY2VzIChJWEcpCmkuIEJhc2ljIE1hdGVyaWFscyAoTVhJKQpqLiBFbmVyZ3kgKElYQykKClRoZSB0aGlyZCBncm91cCBpcyBib25kIEVURnMuIExpa2UgdGhlIHByZXZpb3VzIHR3byBncm91cHMsIHRoZXNlIEVURnMgcG90ZW50aWFsbHkgY29udGFpbiBmb3J3YXJkLWxvb2tpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0b2NrIG1hcmtldC4gVGhlc2UgRVRGcyB3ZXJlIGNob3NlbiBiZWNhdXNlIHRoZXkgd2VyZSB0aGUgZmlyc3QgZml4ZWQtaW5jb21lIEVURnMgYXZhaWxhYmxlIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBhbmQgaGFkIGVub3VnaCBoaXN0b3J5IGZvciB0aGlzIHBhcGVyIFtATkEyMDE3XS4KCmEuIGlTaGFyZXMgMS0zIFllYXIgVHJlYXN1cnkgQm9uZCBGdW5kIChTSFkpCmIuIGlTaGFyZXMgNy0xMCBZZWFyIFRyZWFzdXJ5IEJvbmQgRnVuZCAoSUVGKQpjLiBpU2hhcmVzIDIwKyBZZWFyIFRyZWFzdXJ5IEJvbmQgRnVuZCAoVExUKQpkLiBpU2hhcmVzIGlCb3h4ICQgSW52ZXN0bWVudCBHcmFkZSBDb3Jwb3JhdGUgQm9uZCBFVEYgKExRRCkKCkxhc3RseSwgYWxsIG9mIHRoZSBhYm92ZSB0aHJlZSBncm91cHMgYXJlIHJ1biB0b2dldGhlci4gT25lIHJlYXNvbiBmb3IgaGF2aW5nIGJvbmQgYW5kIHN0b2NrcyBncm91cGVkIHRvZ2V0aGVyIGlzIHRoZSBmYWN0IHRoYXQgYm9uZHMgYXJlIHNvbWV3aGF0IG9mIGEgc3Vic3RpdHV0ZSBmb3IgZXF1aXRpZXMsIHdoaWNoIHRlbmQgdG8gZHJvcCBtb3JlIGluIGEgcGVyaW9kIG9mIGNyaXNpcyBbQEFtYWRlbzIwMjBdLiBBcyBzdWNoLCBzb21lIHVuZXhwbGFpbmVkIG1vdmVtZW50cyBpbiB0aGUgc3RvY2sgcHJpY2UgY291bGQgYmUgcGlja2VkIHVwIGJ5IGJvbmQgbW92ZW1lbnRzLiAKCkluIGVhY2ggcnVuLCB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGVzIGFyZSBsYWdnZWQgdG8gYXZvaWQgbG9vay1haGVhZCBiaWFzLiBBbGwgb2YgdGhlIHJ1bnMgYW5hbHl6ZSB0aGUgZGlmZmVyZW5jZSBvZiB0aGUgbG9nIG9mIHRoZSBhZGp1c3RlZCBjbG9zaW5nIHByaWNlLiBUaGUgcmVhc29uIGZvciB1c2luZyB0aGUgZGlmZmVyZW5jZWQgbG9nIGlzIHRoYXQgaXQgY2xvc2VseSBhcHByb3hpbWF0ZXMgdGhlIHBlcmNlbnRhZ2UgY2hhbmdlIG9mIHRoZSBwcmljZSBmb3Igc21hbGwgY2hhbmdlcy4gVGhlIHJlYXNvbiBmb3IgdXNpbmcgdGhlIGFkanVzdGVkIGNsb3NpbmcgcHJpY2VzIGlzIHRoYXQgYW4gYWRqdXN0ZWQgY2xvc2luZyBwcmljZSBleGNsdWRlcyB0aGUgZWZmZWN0cyBvZiAiY29ycG9yYXRlIGFjdGlvbnMgc3VjaCBhcyBzdG9jayBzcGxpdHMsIGRpdmlkZW5kcyAvIGRpc3RyaWJ1dGlvbnMgYW5kIHJpZ2h0cyBvZmZlcmluZ3MiIFtAR2FudDIwMTldLiBXaGlsZSBkaXZpZGVuZHMgYXJlIGVzc2VudGlhbCB0byBzdHVkeSB0aGUgbG9uZy10ZXJtIHBlcmZvcm1hbmNlIG9mIGEgc3RyYXRlZ3ksIHN0dWR5aW5nIHNob3J0LXRlcm0gcHJpY2UgbW92ZW1lbnRzIGRvIG5vdCByZXF1aXJlIHVuZGVyc3RhbmRpbmcgdGhlIGVmZmVjdHMgb2YgZGl2aWRlbmQgcmVpbnZlc3RtZW50LiBXaGlsZSB0aGVyZSBhcmUgbWFueSBjYW5kaWRhdGUgRVRGcyBjaG9zZW4sIHRoZXNlIHdlcmUgY2hvc2VuIGJlY2F1c2UgdGhleSBhbGwgaGFkIHByaWNlIGhpc3RvcnkgZ29pbmcgYmFjayB0aHJvdWdoIHRoZSBiZWdpbm5pbmcgb2YgMjAwNC4KCiMgUmVzdWx0cwoKCgpgYGB7cn0KIyBUaGlzIGNvZGUgYmVsb3cgaXMgZm9yIHVzZSBpbiB0aGUgQ0FWaWFSIHNlY3Rpb25zLgpgYGAKCmBgYHtyfQojIEhlcmUgaXMgY29kZSB0aGF0IEknbGwgd3JhcCBzb21lIHBhcnRzIGluIHRvIGF2b2lkIHN1cGVyZmx1b3VzIG91dHB1dApxdWlldCA8LSBmdW5jdGlvbih4KSB7IAogIHNpbmsodGVtcGZpbGUoKSkgCiAgb24uZXhpdChzaW5rKCkpIAogIGludmlzaWJsZShmb3JjZSh4KSkgCn0gCmBgYAoKCmBgYHtyfQojJyBUaGlzIGlzIGEgZnVuY3Rpb24gd2hpY2ggcHVsbHMgZGF0YSBmb3IgdXNlIGluIHRoZSBDQVZpYVIgbW9kZWwKIycKIycgQHBhcmFtIHN5bWJvbCAtIHN5bWJvbCB0byBwdWxsCiMnIEBwYXJhbSBjb21wbF9jYXNlIC0gZGVmYXVsdHMgdG8gdHJ1ZS4uLm9ubHkgaW5jbHVkZXMgY29tcGxldGUgY2FzZXMgaW4gdGhlIGRhdGEKIycgQHBhcmFtIGFkal9jbG9zZSAtIHVzZSBhZGp1c3RlZCBjbG9zaW5nIHByaWNlcy4gRGVmYXVsdCBpcyB5ZXMuCiMnIEBwYXJhbSBsb2dfcmV0dXJuIC0gdXNlIGxvZyByZXR1cm4/IERlZmF1bHQgaXMgeWVzLgojJwojJyBAcmV0dXJuIC0gYSBkYXRhIGZyYW1lIHdoaWNoIGNhbiBiZSBmZWQgaW50byBsYXRlciBmdW5jdGlvbnMKIycgQGV4cG9ydAojJwojJyBAZXhhbXBsZXMgLSBkYXRhX3B1bGwoIlNQWSIpCmRhdGFfcHVsbCA9IGZ1bmN0aW9uKHN5bWJvbCwgY29tcGxfY2FzZSA9IDEsIGFkal9jbG9zZSA9IDEsIGxvZ19yZXR1cm4gPSAxLCBzdGFydF9kYXRlID0gIjE5MDAtMDEtMDEiLCBlbmRfZGF0ZSA9IFN5cy5EYXRlKCkpewogICMgUHVsbCBpbiBkYXRhIGZyb20gcXVhbnRtb2QKICByZXNwb25zZV9wdWxsID0gZ2V0U3ltYm9scyhzeW1ib2wsIGF1dG8uYXNzaWduID0gRkFMU0UsIGZyb20gPSBzdGFydF9kYXRlLCB0byA9IGVuZF9kYXRlKQogICMgR2V0IGFkanVzdGVkIGNsb3NpbmcgcHJpY2UKICBpZiAoYWRqX2Nsb3NlID09IFRSVUUpewogICAgZGYgPSBBZChyZXNwb25zZV9wdWxsKQogIH0gZWxzZSB7CiAgICBkZiA9IENsKHJlc3BvbnNlX3B1bGwpCiAgfQogICMgUmV0dXJuIGNvbXBsZXRlIGNhc2VzIG9ubHkgCiAgaWYgKGNvbXBsX2Nhc2UgPT0gVFJVRSl7CiAgICBkZiA9IGRmW2NvbXBsZXRlLmNhc2VzKGRmKSwgXQogIH0gZWxzZXsKICAgIGRmID0gZGYKICB9CiAgIyBDYWxjdWxhdGUgbG9nIHJldHVybiBvZiBkYXRhCiAgaWYgKGxvZ19yZXR1cm4gPT0gVFJVRSl7CiAgICBsciA9IGxvZyhkZlssMV0vc2hpZnQoZGZbLDFdLCAxLCB0eXBlID0gImxhZyIpKQogICAgIyBDb21iaW5lIGRhdGEKICAgIGRmX291dCA9IGNiaW5kKGRmLCBscikKICAgICMgUmVuYW1lIHRoZSBkYXRhIAogICAgY29sbmFtZXMoZGZfb3V0KSA8LSBjKHN5bT1zeW1ib2wsIHBhc3RlMChzeW1ib2wsICJfbG9nX3JldHVybiIpKQogIH0gZWxzZXsKICAgIGRmX291dCA9IGRmCiAgfQogICMgUmV0dXJuIGRhdGEKICByZXR1cm4oZGZfb3V0KQp9CgoKYGBgCgpgYGB7cn0KIycgUHVsbCB0aGUgZGF0YSBhbmQgcnVuIHRoZSBDQVZpYVIgZnVuY3Rpb24gb24gaXQKIycKIycgQHBhcmFtIGlucHV0X2RhdGEgLSBkYXRhIHRvIHVzZSBpbiB0aGUgZnVuY3Rpb24KIycgQHBhcmFtIHJhbmdlX2RhdGEgLSByYW5nZSBvZiB0aGUgZGF0YSB0byB1c2UKIycKIycgQHJldHVybiAtIGEgbGlzdCBvZiB2YWx1ZXMgZnJvbSB0aGUgY2F2aWFyIGZ1bmN0aW9uCiMnIEBleHBvcnQKIycKIycgQGV4YW1wbGVzIC0gY2F2aWFyX3B1bGwoc3B5KQpjYXZpYXJfcHVsbCA9IGZ1bmN0aW9uKGlucHV0X2RhdGEsIHJhbmdlX2RhdGEgPSAoMjpkaW0oaW5wdXRfZGF0YSlbMV0pKXsKICAjIFJ1biB0aGUgY2F2aWFyIGRhdGEKICBjYXZpYXIgPC0gY2F2aWFyT3B0aW0oaW5wdXRfZGF0YVtyYW5nZV9kYXRhLDJdKQogIHJldHVybihjYXZpYXIpCn0KCmBgYAoKCmBgYHtyfQojJyBGdW5jdGlvbiBmb3IgcHJvZHVjaW5nIHJvbGxpbmcgcHJlZGljdGlvbnMKIycgTW9kZWwgMSA9IFN5bW1ldHJpYyBBYnNvbHV0ZSBWYWx1ZSwgMiA9IEFzeW1tZXRyaWMgc2xvcGUsIDMgPSBJbmRpcmVjdCBHQVJDSCwgNCA9IEFkYXB0aXZlCiMnCiMnIEBwYXJhbSBpbnB1dF9kYXRhIC0gaW5wdXQgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyBmdW5jdGlvbgojJyBAcGFyYW0gcmFuZ2VfZGF0YSAtIHJhbmdlIG9mIHRoZSBkYXRhIHRvIGNvbnNpZGVyCiMnIEBwYXJhbSBuZmNzdCAtIG51bWJlciBvZiBmb3JlY2FzdHMgdG8gbWFrZQojJyBAcGFyYW0gbW9kZWwgLSBtb2RlbCB0byB1c2UgKGludGVnZXJzIDEgdGhyb3VnaCA0KS4gRGVmYXVsdHMgdG8gMS4gCiMnIEBwYXJhbSBsZXZlbCAtIGxldmVsIG9mIHNpZ25pZmljYW5jZSB0byB1c2UuCiMnIEBwYXJhbSBHIC0gYXJndW1lbnQgZm9yIHRoZSBrIHBhcmFtZXRlciBpbiB0aGUgNHRoIG1vZGVsIChhZGFwdGl2ZSkuIERlZmF1bHQgaXMgNQojJwojJyBAcmV0dXJuIC0gYW4geHRzIG9iamVjdCB3aGljaCBjb250YWlucyByb2xsaW5nIENBVmlhUiBwcmVkaWN0aW9ucwojJyBAZXhwb3J0CiMnCiMnIEBleGFtcGxlcyAtIHJvbGxpbmdfcHJlZGljdGlvbnMoc3B5LCBuZmNzdCA9IDIyKQpyb2xsaW5nX3ByZWRpY3Rpb25zID0gZnVuY3Rpb24oaW5wdXRfZGF0YSwgcmFuZ2VfZGF0YSA9ICgyOmRpbShpbnB1dF9kYXRhKVsxXSksIG5mY3N0ID0gMjUwLCBtb2RlbCA9MSwgbGV2ZWwgPSAwLjAxLCBHID0gNSwgY29sID0gMil7CiAgIyBSdW4gdGhlIHZhcnByZWRpY3QgZnVuY3Rpb24KICB2YXJwcmVkaWN0IDwtIHJvbGxhcHBseXIoaW5wdXRfZGF0YVtyYW5nZV9kYXRhLGNvbF0sIGxlbmd0aChyYW5nZV9kYXRhKSAtIG5mY3N0LCBjYXZpYXJPcHRpbSwgbW9kZWwsIGxldmVsLCBwcmVkaWN0ID0gMSwgayA9IEcpICU+JSBsYWcKICAjIEVsaW1pbmF0ZSBOQXMKICAjIHByZWRfbm9fbmEgPSBuYS5vbWl0KHZhcnByZWRpY3QpCiAgIyBSZXR1cm4gdGhlIGRhdGEKICAjIHJldHVybihwcmVkX25vX25hKQogIHJldHVybih2YXJwcmVkaWN0KQp9CgpgYGAKCmBgYHtyfQojJyBGdW5jdGlvbiB0byBDYWxjdWxhdGUgTG9zcyBmcm9tIHRoZSBhYm92ZSBwcmVkaWN0aW9ucwojJwojJyBAcGFyYW0gc3ltYm9sIC0gc3ltYm9sIHRvIHdvcmsgd2l0aCBmcm9tIHF1YW50bW9kLiBNdXN0IGJlIGluIHF1b3RhdGlvbnMgdG8gd29yawojJyBAcGFyYW0gc3RhcnRfZHQgLSBzdGFydCBkYXRlIG9mIHRoZSBkYXRhIHRvIGJ1aWxkIHRoZSBmb3JlY2FzdCBvbiAKIycgQHBhcmFtIGVuZF9kdCAtIGVuZCBkYXRlIG9mIHRoZSBkYXRhIHRvIGJ1aWxkIHRoZSBmb3JlY2FzdCBvbiAgCiMnIEBwYXJhbSBuZmNzdCAtIG51bWJlciBvZiBkYXRhIHBvaW50cyB0byB1c2UgaW4gdGhlIGZvcmVjYXN0CiMnIEBwYXJhbSBtb2RlbCAtIG1vZGVsIHRvIHVzZS4gRGVmYXVsdHMgdG8gMQojJyBAcGFyYW0gbGV2ZWwgLSBsZXZlbCBvZiBzaWduaWZpY2FuY2UuIERlZmF1bHRzIHRvIDElCiMnIEBwYXJhbSBHIC0gYXJndW1lbnQgZm9yIHRoZSBrIHBhcmFtZXRlciBpbiB0aGUgNHRoIG1vZGVsIChhZGFwdGl2ZSkuIERlZmF1bHQgaXMgNQojJwojJyBAcmV0dXJuIC0gbG9zcyB1c2luZyBhYnNvbHV0ZSB2YWx1ZQojJyBAZXhwb3J0IC0gYSBwbG90IG9mIHRoZSBkYXRhCiMnCiMnIEBleGFtcGxlcwpsb3NzX2NhbGNfdXYgPSBmdW5jdGlvbihzeW1ib2wsIHN0YXJ0X2R0LCBlbmRfZHQsIG5mY3N0LCBtb2RlbCA9IDEsIGxldmVsID0gMC4wMSwgRyA9IDUpewogICMgUHVsbCBpbiB0aGUgZGF0YQogIHJhd19kYXRhID0gZGF0YV9wdWxsKHN5bWJvbCwgc3RhcnRfZGF0ZSA9IHN0YXJ0X2R0LCBlbmRfZGF0ZSA9IGVuZF9kdCkKICAjIEZvcmVjYXN0IGJhc2VkIG9uIHRoZSBkYXRhCiAgZmNzdCA9IG5hLm9taXQocm9sbGluZ19wcmVkaWN0aW9ucyhyYXdfZGF0YSwgbmZjc3QgPSBuZmNzdCwgbW9kZWwgPSBtb2RlbCwgbGV2ZWwgPSBsZXZlbCwgRyA9IEcpKSooLTEpCiAgIyBFeHRyYWN0IGFjdHVhbHMKICBhY3QgPSB0YWlsKHJhd19kYXRhLCBuID0gbmZjc3QpWywyXQogICMgSm9pbiB0aGUgdHdvIHRvZ2V0aGVyIGFuZCByZW5hbWUKICBqb2luID0gbWVyZ2UoZmNzdCxhY3QsYWxsPVRSVUUpCiAgY29sbmFtZXMoam9pbikgPC0gYygiRmNzdF9WYVIiLCAiQWN0X1JldHVybiIpCiAgIyBwcmludChqb2luKQogICMgQ2FsY3VsYXRlIHRoZSBsb3NzZXMKICBsb3NzID0gYWJzKHN1bShpZmVsc2UoYWN0ID4gZmNzdCwgbGV2ZWwsICgtMSkqKDEtbGV2ZWwpKSkpCiAgIyBQbG90IHRoZSBkYXRhCiAgcGxvdCA9IHBsb3QueHRzKGpvaW4sIGNvbCA9IGMoInJlZCIsICJibGFjayIpLCBsdHkgPSBjKDIsMSksIG1haW4gPSAiTG9nIFJldHVybiBmcm9tIHRoZSBTUFkgdnMuIEZjc3QuIFZhUiIsZ3JpZC5jb2wgPSBOQSwgbGVnZW5kLmxvYyA9ICJib3R0b21sZWZ0IikKICByZXR1cm4obGlzdChsb3NzLCBwbG90LCBhY3QsIGZjc3QpKQp9CgpgYGAKCgpgYGB7ciwgY2FjaGUgPSBUUlVFfQojJyBUaGlzIGlzIGEgZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhIGRhdGEgZnJhbWUgZm9yIHRoZSByZXNwb25zZSBhbmQgZXhwbGFuYXRvcnkgdmFyaWFibGVzIHRoYXQgd2UnbGwgZmVlZCBpbnRvIHRoZSBkaWZmdXNpb24gaW5kZXgKIycKIycgQHBhcmFtIHN5bWJvbF9saXN0IC0gYSBsaXN0IG9mIHN5bWJvbHMgcmVjb2duaXphYmxlIGJ5IHRoZSAKIycgQHBhcmFtIHJlc3BfdmFyIC0gdGhlIHJlc3BvbnNlIHZhcmlhYmxlIHdlJ2QgbGlrZSB0byBmb3JlY2FzdDsgZGVmYXVsdCBpcyBTUFkKIycgQHBhcmFtIGNvbXBsX2Nhc2UgLSBkZWZhdWx0cyB0byB0cnVlLi4ub25seSBpbmNsdWRlcyBjb21wbGV0ZSBjYXNlcyBpbiB0aGUgZGF0YQojJyBAcGFyYW0gYWRqX2Nsb3NlIC0gdXNlIGFkanVzdGVkIGNsb3NpbmcgcHJpY2VzIGZvciB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGVzPyBkZWZhdWx0IGlzIDEgZm9yIFlFUwojJyBAcGFyYW0gcmVzcF9hZGpfY2xvc2UgLSB1c2UgYWRqdXN0ZWQgY2xvc2luZyBwcmljZXMgZm9yIHRoZSBleHBsYW5hdG9yeSB2YXJpYWJsZXM/IGRlZmF1bHQgaXMgMSBmb3IgWUVTCiMnIEBwYXJhbSBzdGFydF9kYXRlIC0gc3RhcnRpbmcgZGF0YSB0byB1c2UKIycgQHBhcmFtIGVuZF9kYXRlIC0gZW5kaW5nIGRhdGUgb2YgdGhlIGRhdGEKIycgQHBhcmFtIGxhZ19wcmVkIC0gZG8gd2UgbGFnIHRoZSBwcmVkaWN0aW9ucz8gSXQgaXMgU1RST05HTFkgcmVjb21tZW5kZWQgdGhhdCB0aGlzIGlzIDAKIycKIycgQHJldHVybiAtIGEgZGF0YSBmcmFtZSB3aGljaCBjYW4gYmUgZmVkIGludG8gdGhlIFNXZm9yZSBmdW5jdGlvbgojJyBAZXhwb3J0CiMnCiMnIEBleGFtcGxlcyAtIGRpZmZfaW5kZXhfZGYoYygiWExGIiwgIlhMRSIsICJQU0NUIiwgIlhMViIsICJWUFUiLCAiWExQIiwgIklHRiIsICJYV0VCIiwgIlBQVFkiKSkKZGlmZl9pbmRleF9kZiA9IGZ1bmN0aW9uKHN5bWJvbF9saXN0LCByZXNwX3ZhciA9ICJTUFkiLCBjb21wbF9jYXNlID0gMSwgYWRqX2Nsb3NlID0gMSwgcmVzcF9hZGpfY2xvc2UgPSAxLCBzdGFydF9kYXRlID0gIjE5MDAtMDEtMDEiLCBlbmRfZGF0ZSA9IFN5cy5EYXRlKCksIGxhZ19wcmVkID0gMSl7CiAgIyBQdWxsIGluIHJlc3BvbnNlIHZhcmlhYmxlCiAgcmVzcG9uc2VfcHVsbCA9IGdldFN5bWJvbHMocmVzcF92YXIsIGF1dG8uYXNzaWduID0gRkFMU0UsIGZyb20gPSBzdGFydF9kYXRlLCB0byA9IGVuZF9kYXRlKQogICMgR2V0IGFkanVzdGVkIGNsb3NpbmcgcHJpY2UKICBpZiAocmVzcF9hZGpfY2xvc2UgPT0gVFJVRSl7CiAgICBkaWZmX2RmID0gQWQocmVzcG9uc2VfcHVsbCkKICB9IGVsc2UgewogICAgZGlmZl9kZiA9IENsKHJlc3BvbnNlX3B1bGwpCiAgfQogICMgTG9vcCB0aHJvdWdoIHRoZSBzeW1ib2xzIGFuZCBqb2luIGluIGRhdGEKICBmb3IgKGkgaW4gMTpsZW5ndGgoc3ltYm9sX2xpc3QpKXsKICAgICMgUHVsbCBjbG9zaW5nIHByaWNlCiAgICBleHBsX3B1bGwgPSBnZXRTeW1ib2xzKHN5bWJvbF9saXN0W2ldLCBhdXRvLmFzc2lnbiA9IEZBTFNFLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKICAgICMgRXh0cmFjdCBjbG9zaW5nIHByaWNlIC0gNHRoIGVsZW1lbnQKICAgIGlmIChhZGpfY2xvc2UgPT0gVFJVRSl7CiAgICAgIGV4cGxfY2wgPSBBZChleHBsX3B1bGwpCiAgICB9IGVsc2UgewogICAgICBleHBsX2NsID0gQ2woZXhwbF9wdWxsKQogICAgfQogICAgIyBOZXcgY29kZSBmb3IgNC4xNi4yMDIwIC0gbGFnIHRoZSBleHBsYW5hdG9yeSB2YXJpYWJsZXMKICAgIGlmIChsYWdfcHJlZCA9PSBUUlVFKXsKICAgICAgIyBMYWcgdGhlIGV4cGxhbmF0b3J5IHZhcmlhYmxlcyBieSAxCiAgICAgIGxhZ19leHAgPSBsYWcoZXhwbF9jbCwgMSkKICAgICAgIyBBcHBlbmQgdGhlIGZpcnN0IGxhZyB0byB0aGUgZGF0YSBmcmFtZQogICAgICBkaWZmX2RmID0gbWVyZ2UoZGlmZl9kZiwgbGFnX2V4cCwgam9pbiA9ICJsZWZ0IiwgZmlsbCA9IE5BKQogICAgfSBlbHNlewogICAgICAjIFJldHVybiB0aGUgZGF0YSBmcmFtZSB3aXRob3V0IGxhZ3MKICAgICAgZGlmZl9kZiA9IG1lcmdlKGRpZmZfZGYsIGV4cGxfY2wsIGpvaW4gPSAibGVmdCIsIGZpbGwgPSBOQSkKICAgIH0KICB9CiAgaWYgKGxhZ19wcmVkID09IFRSVUUpewogICAgIyBDaG9wIG9mZiB0aGUgZmlyc3Qgcm93CiAgICBkaWZmX2RmID0gZGlmZl9kZlstMSxdCiAgfQogIGVsc2UgewogICAgcHJpbnQoIlBMRUFTRSBOT1RFIC0gdGhlIGV4cGxhbmF0b3J5IHZhcmlhYmxlcyBpbiB0aGlzIERGIGFyZSBOT1QgbGFnZ2VkLiBCZSBjYXJlZnVsIHRvIGF2b2lkIGxvb2stYWhlYWQgYmlhcyEiKQogIH0KICAjIFJldHVybiBjb21wbGV0ZSBjYXNlcyBvbmx5IAogIGlmIChjb21wbF9jYXNlID09IFRSVUUpewogICAgZGlmZl9kZl9vdXQgPSBkaWZmX2RmW2NvbXBsZXRlLmNhc2VzKGRpZmZfZGYpLCBdCiAgfSBlbHNlewogICAgZGlmZl9kZl9vdXQgPSBkaWZmX2RmCiAgfQogIAogIHJldHVybihkaWZmX2RmX291dCkKfQoKYGBgCgpgYGB7ciwgY2FjaGUgPSBUUlVFfQojJyBDb252ZXJ0cyBhIGRpZmZfZGYgaW50byBhIGRhdGEgZnJhbWUgd2l0aCBhcHByb3hpbWF0ZSBwZXJjZW50YWdlIGNoYW5nZXMgZGlmZihsb2coZGlmZl9kZikpCiMnCiMnIEBwYXJhbSBkaWZmX2RmIC0gb3V0cHV0IG9mIHRoZSBkaWZmX2luZGV4X2RmIGZ1bmN0aW9uIHdpdGggY29tcGxldGUgY2FzZXMKIycKIycgQHJldHVybiAtIHJldHVucyB0aGUgZGlmZmVyZW5jZWQgZGF0YQojJyBAZXhwb3J0CiMnCiMnIEBleGFtcGxlcyAtIHBjX2RpZmZfaW5kZXgodGVzdF9jb21wbCkgCgpwY19kaWZmX2luZGV4ID0gZnVuY3Rpb24oZGlmZl9kZil7CiAgIyBEaWZmZXJlbmNlIHRoZSBsb2cgb2YgdGhlIGRhdGEKICBwY19kaWZmX2luZGV4ID0gZGlmZihsb2coZGlmZl9kZikpCiAgIyBSZW1vdmUgdGhlIGZpcnN0IHJvdwogIHBjX2RpZmZfaW5kZXhfb3V0ID0gcGNfZGlmZl9pbmRleFstMSxdCiAgcmV0dXJuKHBjX2RpZmZfaW5kZXhfb3V0KQp9CgpgYGAKCgpgYGB7cn0KIycgQmVsb3cgaXMgdGhlIG1vZGlmaWVkIGRpZmZ1c2lvbiBpbmRleCBjb2RlLgojJwojJyBAcGFyYW0geSAtIHJlc3BvbnNlIHZhcmlhYmxlCiMnIEBwYXJhbSB4IC0gcHJlZGljdG9yIHZhcmlhYmxlcwojJyBAcGFyYW0gb3JpZyAtIGZvcmVjYXN0IG9yaWdpbgojJyBAcGFyYW0gbSAtIG51bWJlciBvZiBkaWZmdXNpb24gaW5kZXhlcyB1c2VkCiMnIEBwYXJhbSB0YXUgLSBWYVIgbGV2ZWwgdG8gdXNlOyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMQojJyBAcGFyYW0gZW5kIC0gc3BlY2lmaWVzIGFuIGFsdGVybmF0ZSBlbmRpbmcgdmFsdWUKIycgQHBhcmFtIHByaW50X21kbCAtIHByaW50IHRoZSBtb2RlbCBzdW1tYXJ5IGFuZCB0aGUgTVNFCiMnCiMnIEByZXR1cm4gLSByZXR1cm5zIGEgbGlzdCBvZiB2YXJpYWJsZXMgZm9yIHVzZSBpbiB0aGUgZGlmZnVzaW9uIGluZGV4CiMnIEBleHBvcnQKIycKIycgQGV4YW1wbGVzCm1vZF9kaSA9IGZ1bmN0aW9uICh5LCB4LCBvcmlnLCBtLCB0YXUsIGVuZCA9IE5VTEwsIHByaW50X21kbCA9IDApIAp7CiAgIyBDb252ZXJ0cyB0aGUgcmVzcG9uc2UgdmFyaWFibGVzIGludG8gYSBtYXRyaXgKICBpZiAoIWlzLm1hdHJpeCh4KSkgCiAgICAgIHggPSBhcy5tYXRyaXgoeCkKICAjIG5UIGlzIG51bWJlciBvZiB0IHRpbWUtc3RlcHMKICBuVCA9IGRpbSh4KVsxXQogICMgQWRkIGEgbGluZSB0byBlc3RhYmxpc2ggdGhlIG51bWJlciBvZiBkYXRhIHBvaW50cyB1c2VkIGluIHRoZSB0ZXN0LgogIGlmIChpcy5udWxsKGVuZCkgIT0gVFJVRSl7CiAgICBuVCA9IGVuZAogIH0KICAjIGsgaXMgdGhlIG51bWJlciBvZiBkaWZmdXNpb24gaW5kaWNlcyB1c2VkCiAgayA9IGRpbSh4KVsyXQogICMgU2FuaXR5IGNoZWNrcyB0byBlbnN1cmUgdGhhdCB0aGUgb3JpZ2luIGlzbid0IHBhc3QgdGhlIG51bWJlciBvZiB0aW1lIHBvaW50cwogIGlmIChvcmlnID4gblQpIAogICAgICBvcmlnID0gblQKICAjIE1ha2VzIHN1cmUgdGhhdCB0aGVyZSBhcmVuJ3QgbW9yZSBwcmVkaWN0b3JzIHRoYW4gdGhlcmUgdmFyaWFibGVzIGluIHRoZSBkYXRhc2V0CiAgaWYgKG0gPiBrKSAKICAgICAgbSA9IGsKICAjIE1ha2VzIHN1cmUgdGhlcmUgYXJlIGF0IGxlYXN0IHNvbWUgdmFyaWFibGVzCiAgaWYgKG0gPCAxKSAKICAgICAgbSA9IDEKICAjIFN1YmRpdmlkZXMgdGhlIGRhdGFmcmFtZQogIHgxID0geFsxOm9yaWcsIF0KICAjIENhbGN1bGF0ZXMgbWVhbnMgb2YgZWFjaCByb3cKICBtZSA9IGFwcGx5KHgxLCAyLCBtZWFuKQogICMgQ2FsY3VsYXRlcyBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIGVhY2ggY29sdW1uCiAgc2UgPSBzcXJ0KGFwcGx5KHgxLCAyLCB2YXIpKQogICMgQ3JlYXRlcyBhIG1hdHJpeCB4MSwgd2hpY2ggbm9ybWFsaXplcyBhbGwgdGhlIGNvbHVtbnMuIAogICMgVGhpcyBtYXkgYmUgYW4gaXNzdWUgc2luY2UgaXQgYXNzdW1lcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc3VmZmljaWVudGx5IGRlc2NyaWJlZCBieSB0aGUgZmlyc3QgdHdvIG1vbWVudHMKICB4MSA9IHgKICBmb3IgKGkgaW4gMTprKSB7CiAgICAgIHgxWywgaV0gPSAoeDFbLCBpXSAtIG1lW2ldKS9zZVtpXQogIH0KICBWMSA9IGNvdih4MVsxOm9yaWcsIF0pCiAgIyBQZXJmb3JtcyBhbiBlaWdlbiBkZWNvbXBvc2l0aW9uCiAgbTEgPSBlaWdlbihWMSkKICAjIFNlbGVjdHMgZWlnZW52YWx1ZXMKICBzZGV2ID0gbTEkdmFsdWVzCiAgIyBTZWxlY3RzIGVpZ2VudmVjdG9ycwogIE0gPSBtMSR2ZWN0b3JzCiAgIyBNYWtlcyBhIHNtYWxsZXIgbWF0cml4CiAgTTEgPSBNWywgMTptXQogICMgVGhpcyBpcyB0aGUgZGlmZnVzaW9uIGluZGV4IG1vZGVsIC0gW29yaWcgeCBwXSpbcCB4IG1dID0gW29yaWcgeCBtXQogIERpbmRleCA9IHgxICUqJSBNMQogICMgQ3V0IGRvd24gYm90aCB0aGUgcmVzcG9uc2UgYW5kIHByZWRpY3RvcnMgdG8gYmUgYSByZWFzb25hYmxlIHNpemUKICB5MSA9IHlbMTpvcmlnXQogIERGID0gRGluZGV4WzE6b3JpZywgXQogICMgQXBwbHkgdGhlIGxpbmVhciBtb2RlbCAtIEhFUkUgaXMgdGhlIGtleS4KICAjIG1tID0gbG0oeTEgfiBERikgLSBvbGQgZnVuY3Rpb24KICBtbSA9IHJxKHkxIH4gREYsIHRhdSA9IHRhdSkKICAjIFByaW50IHRoZSBkYXRhCiAgaWYgKHByaW50X21kbCA9PSAxKXsKICAgIHByaW50KHN1bW1hcnkobW0pKQogIH0KICAjIFB1dHMgY29lZmZpY2llbnRzIGluIGEgbWF0cml4CiAgY29lZiA9IG1hdHJpeChtbSRjb2VmZmljaWVudHMsIChtICsgMSksIDEpCiAgIyBJbml0aWFsaXplcyB5aGF0IHZhcmlhYmxlcyBhbmQgTVNFCiAgeWhhdCA9IE5VTEwKICBNU0UgPSBOVUxMCiAgaWYgKG9yaWcgPCBuVCkgewogICAgIyBDcmVhdGVzIGEgbmZjc3QgYnkgKG0rMSkgbWF0cml4CiAgICBuZXd4ID0gY2JpbmQocmVwKDEsIChuVCAtIG9yaWcpKSwgRGluZGV4WyhvcmlnICsgMSk6blQsIAogICAgICAgIF0pCiAgICAjIFtuZmNzdHgobSsxKV0qWyhtKzEpeDFdID0gW25mY3N0eDFdCiAgICB5aGF0ID0gbmV3eCAlKiUgY29lZgogICAgIyBDYWxjdWxhdGVzIGVycm9ycwogICAgZXJyID0geVsob3JpZyArIDEpOm5UXSAtIHloYXQKICAgIE1TRSA9IG1lYW4oZXJyXjIpCiAgICBpZiAocHJpbnRfbWRsID09IDEpewogICAgICBjYXQoIk1TRSBvZiBvdXQtb2Ytc2FtcGxlIGZvcmVjYXN0czogIiwgTVNFLCAiXG4iKQogICAgfQogIH0KICBTV2ZvcmUgPC0gbGlzdChjb2VmID0gY29lZiwgeWhhdCA9IHloYXQsIE1TRSA9IE1TRSwgbG9hZGluZ3MgPSBNMSwgCiAgICAgIERGaW5kZXggPSBEaW5kZXgpCn0KCmBgYAoKCmBgYHtyfQojJyBCZWxvdyBpcyB0aGUgbW9kaWZpZWQgZGlmZnVzaW9uIGluZGV4IGNvZGUgdG8gaW5jbHVkZSBsYWdnZWQgdmFyaWFibGVzLgojJwojJyBAcGFyYW0geSAtIHJlc3BvbnNlIHZhcmlhYmxlCiMnIEBwYXJhbSB4IC0gcHJlZGljdG9yIHZhcmlhYmxlcwojJyBAcGFyYW0gb3JpZyAtIGZvcmVjYXN0IG9yaWdpbgojJyBAcGFyYW0gbSAtIG51bWJlciBvZiBkaWZmdXNpb24gaW5kZXhlcyB1c2VkCiMnIEBwYXJhbSB0YXUgLSBWYVIgbGV2ZWwgdG8gdXNlOyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMQojJyBAcGFyYW0gYXJfdGYgLSBBUiB0cmFuc2Zvcm1hdGlvbiB0eXBlLiAoMSAtIG5vIHRyYW5zZm9ybWF0aW9uLAojJyAyIC0gYWJzb2x1dGUgdmFsdWUsIDMgLSBhc3ltbWV0cmljIHNsb3BlKQojJyBAcGFyYW0gcCAtIG51bWJlciBvZiBBUiBsYWdzIHRvIGluY2x1ZGUuIERlZmF1bHQgaXMgb25lLgojJyBAcGFyYW0gcHJpbnRfbWRsIC0gb3B0aW9uIHRvIHByaW50IHRoZSBtb2RlbCBzdW1tYXJ5IHRvIG1ha2Ugc3VyZSBldmVyeXRuaW5nIGlzIG9rLiAwIGlzIGRlZmF1bHQuCiMnIEBwYXJhbSBtb2RlbCAtIG1vZGVsIHR5cGUgKDEgLSBTQVYsIDIgLSBBUywgMyAtIEdBUkNILCA0IC0gQURBUFRJVkUpIAojJwojJyBAcmV0dXJuIC0gcmV0dXJucyBhIGxpc3Qgb2YgdmFyaWFibGVzIGZvciB1c2UgaW4gdGhlIGRpZmZ1c2lvbiBpbmRleAojJyBAZXhwb3J0CiMnCiMnIEBleGFtcGxlcwptb2RfZGlfd2wgPSBmdW5jdGlvbiAoeSwgeCwgb3JpZywgbSwgdGF1LCBhcl90ZiA9IDEsIHAgPSAxLCBwcmludF9tZGwgPSAwLCBtb2RlbCA9IDEsIGVuZCA9IE5VTEwpIAp7CiAgIyBDb252ZXJ0cyB0aGUgcmVzcG9uc2UgdmFyaWFibGVzIGludG8gYSBtYXRyaXgKICBpZiAoIWlzLm1hdHJpeCh4KSkgCiAgICAgIHggPSBhcy5tYXRyaXgoeCkKICAjIG5UIGlzIG51bWJlciBvZiB0IHRpbWUtc3RlcHMKICBuVCA9IGRpbSh4KVsxXQogICMgQWRkIGEgbGluZSB0byBlc3RhYmxpc2ggdGhlIG51bWJlciBvZiBkYXRhIHBvaW50cyB1c2VkIGluIHRoZSB0ZXN0LgogIGlmIChpcy5udWxsKGVuZCkgIT0gVFJVRSl7CiAgICBuVCA9IGVuZAogIH0KICAjIGsgaXMgdGhlIG51bWJlciBvZiBkaWZmdXNpb24gaW5kaWNlcyB1c2VkCiAgayA9IGRpbSh4KVsyXQogICMgU2FuaXR5IGNoZWNrcyB0byBlbnN1cmUgdGhhdCB0aGUgb3JpZ2luIGlzbid0IHBhc3QgdGhlIG51bWJlciBvZiB0aW1lIHBvaW50cwogIGlmIChvcmlnID4gblQpIAogICAgICBvcmlnID0gblQKICAjIE1ha2VzIHN1cmUgdGhhdCB0aGVyZSBhcmVuJ3QgbW9yZSBwcmVkaWN0b3JzIHRoYW4gdGhlcmUgdmFyaWFibGVzIGluIHRoZSBkYXRhc2V0CiAgaWYgKG0gPiBrKSAKICAgICAgbSA9IGsKICAjIE1ha2VzIHN1cmUgdGhlcmUgYXJlIGF0IGxlYXN0IHNvbWUgdmFyaWFibGVzCiAgaWYgKG0gPCAxKSAKICAgICAgbSA9IDEKICAjIFN1YmRpdmlkZXMgdGhlIGRhdGFmcmFtZQogIHgxID0geFsxOm9yaWcsIF0KICAjIENhbGN1bGF0ZXMgbWVhbnMgb2YgZWFjaCByb3cKICBtZSA9IGFwcGx5KHgxLCAyLCBtZWFuKQogICMgQ2FsY3VsYXRlcyBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIGVhY2ggY29sdW1uCiAgc2UgPSBzcXJ0KGFwcGx5KHgxLCAyLCB2YXIpKQogICMgQ3JlYXRlcyBhIG1hdHJpeCB4MSwgd2hpY2ggbm9ybWFsaXplcyBhbGwgdGhlIGNvbHVtbnMuIAogICMgVGhpcyBtYXkgYmUgYW4gaXNzdWUgc2luY2UgaXQgYXNzdW1lcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc3VmZmljaWVudGx5IGRlc2NyaWJlZCBieSB0aGUgZmlyc3QgdHdvIG1vbWVudHMKICB4MSA9IHgKICBmb3IgKGkgaW4gMTprKSB7CiAgICAgIHgxWywgaV0gPSAoeDFbLCBpXSAtIG1lW2ldKS9zZVtpXQogIH0KICBWMSA9IGNvdih4MVsxOm9yaWcsIF0pCiAgIyBQZXJmb3JtcyBhbiBlaWdlbiBkZWNvbXBvc2l0aW9uCiAgbTEgPSBlaWdlbihWMSkKICAjIFNlbGVjdHMgZWlnZW52YWx1ZXMKICBzZGV2ID0gbTEkdmFsdWVzCiAgIyBTZWxlY3RzIGVpZ2VudmVjdG9ycwogIE0gPSBtMSR2ZWN0b3JzCiAgIyBNYWtlcyBhIHNtYWxsZXIgbWF0cml4CiAgTTEgPSBNWywgMTptXQogICMgVGhpcyBpcyB0aGUgZGlmZnVzaW9uIGluZGV4IG1vZGVsIC0gW29yaWcgeCBwXSpbcCB4IG1dID0gW29yaWcgeCBtXQogIERpbmRleCA9IHgxICUqJSBNMQogICMgQ3V0IGRvd24gYm90aCB0aGUgcmVzcG9uc2UgYW5kIHByZWRpY3RvcnMgdG8gYmUgYSByZWFzb25hYmxlIHNpemUKICB5MSA9IHlbMTpvcmlnXQogIERGID0gRGluZGV4WzE6b3JpZywgXQogICMgQ29weSB0aGUgZGF0YSBmcmFtZQogIERGX3dsID0gRGluZGV4CiAgIyBMYWcgdGhlIHktdmFyaWFibGUKICBmb3IgKGkgaW4gMTpwKXsKICAgICMgQ3JlYXRlIGEgbGFnZ2VkIHZhcmlhYmxlCiAgICBsYWdfdmFyID0gbGFnKHksIGkpCiAgICAjIEFwcGVuZCB0aGUgZmlyc3QgbGFnIHRvIHRoZSBkYXRhIGZyYW1lCiAgICBERl93bCA9IGNiaW5kKERGX3dsLGxhZ192YXIpCiAgfQogICMgSWRlbnRpZnkgdGhlIHJpZ2h0IGNvbHVtbnMKICBsX2FyID0gbmNvbChERl93bCkKICBmX2FyID0gbF9hciAtIHAgKyAxCiAgIyBLZWVwIHRoZSBsYXN0IGNvbHVtbnMga2VwdCB0byB0aGUgc2lkZQogIGFsbF9sYWcgPSBERl93bFssKGZfYXI6bF9hcildCiAgIyBDdXQgb2ZmIHRoZSBmaXJzdCByb3cgdG8gYXZvaWQgTkEncwogIERGX3RyaW0gPSBERl93bFsxOm9yaWcsXQogICMgUmVuYW1lIHRoZSBjb2x1bW5zCiAgIyBIZXJlJ3MgdGhlIG5ldyBmdW5jdGlvbiB3aXRoIGFuIHVudHJhbnNmb3JtZWQgQVIocCkgbGFnCiAgaWYgKGFyX3RmID09IDEpewogICAgIyBJbmNvcnBvcmF0ZSBldmVyeXRoaW5nIGluIHRvIGFuIGlucHV0IGRhdGEgZnJhbWUKICAgIGRmX2luID0gY2JpbmQoeTFbLSgxOnApXSwgREZfdHJpbVstKDE6cCksXSkKICAgICMgUmVuYW1lIHRoZSBjb2x1bW5zCiAgICAjIEluaXRpYWxpemUgYSBjaGFyYWN0ZXIgdmVjdG9yCiAgICBudmVjID0gYyhyZXAoMCwgMSttK3ApKQogICAgIyBQb3B1bGF0ZSB0aGUgdmVjdG9yIC0gZmlyc3QgdmFsdWUgaXMgdGhlIHJlc3BvbnNlCiAgICBudmVjWzFdIDwtIG5hbWVzKHkpCiAgICAjIE5leHQgYXJlIHRoZSBkaWZmdXNpb24gaW5kaWNlcwogICAgZm9yIChpIGluIDE6bSl7CiAgICAgIG52ZWNbaSsxXSA9IHBhc3RlMCgiRGlmZl9JbmRleF8iLCBpKQogICAgfQogICAgIyBOZXh0IGFyZSB0aGUgbGFnZ2VkIHZhcmlhYmxlcwogICAgZm9yIChpIGluIDE6cCl7CiAgICAgIG52ZWNbaSsxK21dID0gcGFzdGUwKCJMYWdfIiwgaSkKICAgIH0KICAgICMgQXNzaWduIHRoZSBuYW1lcwogICAgbmFtZXMoZGZfaW4pIDwtIG52ZWMKICAgICMgUnVuIHRoZSBtb2RlbAogICAgbW0gPSBycShkZl9pblssMV0gfiBkZl9pblssLTFdLCB0YXUgPSB0YXUpCiAgfQogICMgSGVyZSdzIHRoZSBuZXcgZnVuY3Rpb24gd2l0aCBhbiBTQVYgQVIocCkgbGFnCiAgaWYgKGFyX3RmID09IDIpewogICAgIyBJbmNvcnBvcmF0ZSBldmVyeXRoaW5nIGluIHRvIGFuIGlucHV0IGRhdGEgZnJhbWUKICAgIGRmX2luID0gY2JpbmQoeTFbLSgxOnApXSwgREZfdHJpbVstKDE6cCksLShmX2FyOmxfYXIpXSwgYWJzKERGX3RyaW1bLSgxOnApLChmX2FyOmxfYXIpXSkpCiAgICAjIFJlbmFtZSB0aGUgY29sdW1ucwogICAgIyBJbml0aWFsaXplIGEgY2hhcmFjdGVyIHZlY3RvcgogICAgbnZlYyA9IGMocmVwKDAsIDErbStwKSkKICAgICMgUG9wdWxhdGUgdGhlIHZlY3RvciAtIGZpcnN0IHZhbHVlIGlzIHRoZSByZXNwb25zZQogICAgbnZlY1sxXSA8LSBuYW1lcyh5KQogICAgIyBOZXh0IGFyZSB0aGUgZGlmZnVzaW9uIGluZGljZXMKICAgIGZvciAoaSBpbiAxOm0pewogICAgICBudmVjW2krMV0gPSBwYXN0ZTAoIkRpZmZfSW5kZXhfIiwgaSkKICAgIH0KICAgICMgTmV4dCBhcmUgdGhlIGxhZ2dlZCB2YXJpYWJsZXMKICAgIGZvciAoaSBpbiAxOnApewogICAgICBudmVjW2krMSttXSA9IHBhc3RlMCgiTGFnXyIsIGkpCiAgICB9CiAgICAjIEFzc2lnbiB0aGUgbmFtZXMuIE5vdGUgdGhhdCB0aGlzIGlzIGEgbWF0cml4CiAgICBuYW1lcyhkZl9pbikgPC0gbnZlYwogICAgIyBSdW4gdGhlIG1vZGVsCiAgICBtbSA9IHJxKGRmX2luWywxXSB+IGRmX2luWywtMV0sIHRhdSA9IHRhdSkKICB9CiAgIyBIZXJlJ3MgdGhlIG5ldyBmdW5jdGlvbiB3aXRoIGFuIGFzeW1tZXRyaWMgc2xvcGUgZm9yIHRoZSBBUigxKSBsYWcKICAjIEluZGljYXRvcjsgMCBpZiBwZXJjZW50IGNoYW5nZSBpcyBuZWdhdGl2ZSwgMSBpZiBpdCdzIHBvc2l0aXZlCiAgIyBpbmRpID0gaWZlbHNlKERGX3RyaW1bLGFyXSA8IDAsIDAsIDEpCiAgaWYgKGFyX3RmID09IDMpewogICAgIyBDcmVhdGUgYSBtYXRyaXggb2YgaW5kaWNhdG9ycwogICAgaW5kaV9tYXQgPSBtYXRyaXgoMCwgbnJvdyhERl93bCksIHApCiAgICAjIEdlbmVyYWxpemUgdGhlIGFib3ZlIGNvZGUKICAgIGZvciAoaSBpbiAxOnApewogICAgICAjIFBvcHVsYXRlIHRoZSBpbmRpY2F0b3IKICAgICAgaW5kaV9tYXRbLGldID0gaWZlbHNlKERGX3dsWyxmX2FyICsgaSAtIDFdIDwgMCwgMCwgMSkKICAgIH0KICB9CiAgIyBGaXR0aW5nIHRoZSByZWdyZXNzaW9uCiAgaWYgKGFyX3RmID09IDMpewogICAgIyBJbmNvcnBvcmF0ZSBldmVyeXRoaW5nIGluIHRvIGFuIGlucHV0IGRhdGEgZnJhbWUKICAgIGRmX2luID0gY2JpbmQoeTFbLSgxOnApXSwgREZfdHJpbVstKDE6cCksLShmX2FyOmxfYXIpXSwgREZfdHJpbVstKDE6cCksKGZfYXI6bF9hcildLCBpbmRpX21hdFsoKHArMSk6b3JpZyksXSkKICAgICMgUmVuYW1lIHRoZSBjb2x1bW5zCiAgICAjIEluaXRpYWxpemUgYSBjaGFyYWN0ZXIgdmVjdG9yCiAgICBudmVjID0gYyhyZXAoMCwgMSttKzIqcCkpCiAgICAjIFBvcHVsYXRlIHRoZSB2ZWN0b3IgLSBmaXJzdCB2YWx1ZSBpcyB0aGUgcmVzcG9uc2UKICAgIG52ZWNbMV0gPC0gbmFtZXMoeSkKICAgICMgTmV4dCBhcmUgdGhlIGRpZmZ1c2lvbiBpbmRpY2VzCiAgICBmb3IgKGkgaW4gMTptKXsKICAgICAgbnZlY1tpKzFdID0gcGFzdGUwKCJEaWZmX0luZGV4XyIsIGkpCiAgICB9CiAgICAjIE5leHQgYXJlIHRoZSBsYWdnZWQgdmFyaWFibGVzCiAgICBmb3IgKGkgaW4gMTpwKXsKICAgICAgbnZlY1tpKzErbV0gPSBwYXN0ZTAoIkxhZ18iLCBpKQogICAgfQogICAgIyBMYXN0IGFyZSB0aGUgcG9zaXRpdmUgaW5kaWNhdG9yIHZhcmlhYmxlcwogICAgZm9yIChpIGluIDE6cCl7CiAgICAgIG52ZWNbaSsxK20rcF0gPSBwYXN0ZTAoIlBvc19WYWxfZm9yX0xhZ18iLCBpKQogICAgfQogICAgIyBBc3NpZ24gdGhlIG5hbWVzLiBOb3RlIHRoYXQgdGhpcyBpcyBhIG1hdHJpeAogICAgbmFtZXMoZGZfaW4pIDwtIG52ZWMKICAgICMgUnVuIHRoZSBtb2RlbAogICAgbW0gPSBycShkZl9pblssMV0gfiBkZl9pblssLTFdLCB0YXUgPSB0YXUpCiAgICAjIG1tID0gcnEoeTFbLSgxOnApXSB+IERGX3RyaW1bLSgxOnApLC0oZl9hcjpsX2FyKV0gKyBERl90cmltWy0oMTpwKSwoZl9hcjpsX2FyKV0gKyBpbmRpX21hdFsoKHArMSk6b3JpZyksXSwgdGF1ID0gdGF1KQogICAgIyBBZGQgYSBkaWZmZXJlbnQgbGluZSB0byBhY2NvdW50IGZvciB0aGUgaW5kaWNhdG9yIHZhcmlhYmxlCiAgICAjIGludGVyY2VwdCArIG0gKyAyKm5sYWcgdG8gYWNjb3VudCBmb3IgdGhlIG51bWJlciBvZiBpbmRpY2F0b3IgdmFyaWFibGVzCiAgICBjb2VmID0gbWF0cml4KG1tJGNvZWZmaWNpZW50cywgKDEgKyBtICsgMipwKSwgMSkKICB9CiAgaWYgKHByaW50X21kbCA9PSAxKXsKICAgIHByaW50KHN1bW1hcnkobW0pKQogIH0KICAjIFB1dHMgY29lZmZpY2llbnRzIGluIGEgbWF0cml4IC0gYWRkZWQgdGhlIEFSIHRlcm1zCiAgIyBjb2VmID0gbWF0cml4KG1tJGNvZWZmaWNpZW50cywgKG0gKyAxKSwgMSkKICBpZiAoYXJfdGYgIT0gMyl7CiAgICBjb2VmID0gbWF0cml4KG1tJGNvZWZmaWNpZW50cywgKDEgKyBtICsgcCksIDEpCiAgfQogICMgSW5pdGlhbGl6ZXMgeWhhdCB2YXJpYWJsZXMgYW5kIE1TRQogIHloYXQgPSBOVUxMCiAgbG9zcyA9IE5VTEwKICBpZiAob3JpZyA8IG5UKSB7CiAgICAjIENyZWF0ZXMgYSBuZmNzdCBieSAobSsyKSBtYXRyaXgKICAgICMgQWRkIG9uIHRoZSBsYWdnZWQgdmFyaWFibGVzCiAgICBuZXd4ID0gY2JpbmQocmVwKDEsIChuVCAtIG9yaWcpKSwgRGluZGV4WyhvcmlnICsgMSk6blQsIF0sIGFsbF9sYWdbKG9yaWcrMSk6blQsXSkKICAgICMgSW5jb3Jwb3JhdGUgbGFnZ2VkIHZhcmlhYmxlcwogICAgaWYgKGFyX3RmID09IDMpewogICAgICBuZXd4ID0gY2JpbmQocmVwKDEsIChuVCAtIG9yaWcpKSwgRGluZGV4WyhvcmlnICsgMSk6blQsIF0sIGFsbF9sYWdbKG9yaWcrMSk6blQsXSwgaW5kaV9tYXRbKG9yaWcrMSk6blQsXSkKICAgIH0KICAgICMgW25mY3N0eChtKzEpXSpbKG0rMSl4MV0gPSBbbmZjc3R4MV0KICAgIHloYXQgPSBuZXd4ICUqJSBjb2VmCiAgICAjIENhbGN1bGF0ZXMgZXJyb3JzCiAgICBsb3NzID0gYWJzKHN1bShpZmVsc2UoeVsob3JpZyArIDEpOm5UXSA+IHloYXQsIHRhdSwgKC0xKSooMS10YXUpKSkpCiAgICAjIE1vZGlmeWluZyB0aGlzIHBhcnQgdG8gb25seSBwcmludCB0aGlzIGlmIHNwZWNpZmllZAogICAgaWYgKHByaW50X21kbCA9PSAxKXsKICAgICAgY2F0KCJMb3NzZXMgb2Ygb3V0LW9mLXNhbXBsZSBmb3JlY2FzdHM6ICIsIGxvc3MsICJcbiIpCiAgICB9CiAgfQogIFNXZm9yZSA8LSBsaXN0KGNvZWYgPSBjb2VmLCB5aGF0ID0geWhhdCwgbG9zcyA9IGxvc3MsIGxvYWRpbmdzID0gTTEsIAogICAgICBERmluZGV4ID0gRGluZGV4LCBuYW1lX3ZlY3RvciA9IG52ZWMpCn0KCmBgYAoKYGBge3J9CiMgRGVjaWRlIG9uIHRoZSBvcHRpbWFsIG51bWJlciBvZiB2ZWN0b3JzLgoKIyAoeSwgeCwgb3JpZywgbSwgdGF1KSAKCiMnIEZ1bmN0aW9uIHRoYXQgY2FsY3VsYXRlcyBsb3NzIG92ZXIgYSBnaXZlbiBwZXJpb2Qgb2YgdGltZSBmb3IgdGhlIGRpZmZ1c2lvbiBpbmRleCBtb2RlbAojJwojJyBAcGFyYW0geSAtIHJlc3BvbnNlIHZhcmlhYmxlcwojJyBAcGFyYW0geCAtIGV4cGxhbmF0b3J5IHZhcmlhYmxlCiMnIEBwYXJhbSBvcmlnIC0gZm9yZWNhc3Qgb3JpZ2luCiMnIEBwYXJhbSBlbmQgLSBmb3JlY2FzdGluZyBlbmRpbmcuIE5vdGU6IGFzIHRoZSBmdW5jdGlvbiBpcyBjdXJyZW50bHkgd3JpdHRlbiBvbiAyLzI0LCB0aGlzIG9wdGlvbiBkb2Vzbid0IGRvIGFueXRoaW5nLgojJyBAcGFyYW0gbSAtIG51bWJlciBvZiBkaWZmdXNpb24gaW5kaWNlcyB0byB1c2UKIycgQHBhcmFtIHRhdSAtIFZhUiBsZXZlbAojJyBAcGFyYW0gbW9kX2RpIC0gdXNlIHRoZSBtb2RpZmllZCBEST8KIycKIycgQHJldHVybiAtIHJldHVybnMgYSBsaXN0IG9mIHRoZSBsb3NzIHN1bSBhbmQgdGhlIGxvc3MgdmVjdG9yCiMnIEBleHBvcnQKIycKIycgQGV4YW1wbGVzIC0gbG9zc19jYWxjKHBjX2RmWywxXSwgcGNfZGZbLC0xXSwgNzU3LCAxMDI3LCAxLCAwLjAxKQpsb3NzX2NhbGMgPSBmdW5jdGlvbih5LCB4LCBvcmlnLCBtLCB0YXUsIG1vZF9kaSA9IDAsIGFyX3RmID0gMSwgcCA9IDEsIHByaW50X21kbCA9IDAsIG1vZGVsID0gMSwgZW5kID0gTlVMTCl7CiAgIyBFeHRyYWN0IHlfaGF0IHZhbHVlcwogIGlmIChtb2RfZGkgPT0gMCl7CiAgICBkaSA9IG1vZF9kaSh5PXkseD14LG9yaWc9b3JpZyxtPW0sIHRhdT10YXUsIGVuZCA9IGVuZCwgcHJpbnRfbWRsID0gcHJpbnRfbWRsKQogIH0KICBlbHNlIHsKICAgIGRpID0gbW9kX2RpX3dsKHk9eSx4PXgsb3JpZz1vcmlnLG09bSwgdGF1PXRhdSwgYXJfdGYgPSBhcl90ZiwgcCA9IHAsIHByaW50X21kbCA9IHByaW50X21kbCwgbW9kZWwgPSBtb2RlbCwgZW5kID0gZW5kKQogIH0KICAjIG1vZF9kaV93bCA9IGZ1bmN0aW9uICh5LCB4LCBvcmlnLCBtLCB0YXUsIGFyX3RmID0gMSwgcCA9IDEsIHByaW50X21kbCA9IDAsIG1vZGVsID0gMSkKICB5aGF0ID0gZGkkeWhhdFsxOihlbmQtb3JpZyldCiAgIyBDYWxjdWxhdGUgdGhlIGxvc3MKICAjIEluaXRpYWxpemUgbG9zcyB2ZWN0b3IKICBsdmVjID0gcmVwKDAsKGVuZC1vcmlnKSkKICAjIFRha2UgdGhlIGRpZmZlcmVuY2UKICBmb3IgKGkgaW4gMTooZW5kLW9yaWcpKXsKICAgICMgQ2FsY3VsYXRlIGFuIGluZGljYXRvciB2YXJpYWJsZQogICAgaW5kID0gaWZlbHNlKHlbb3JpZytpXSA8IHloYXRbaV0sIDEsMCkKICAgICMgVXNlIGluZGljYXRvciBpbiBmdW5jdGlvbiBiZWxvdwogICAgbHZlY1tpXSA9ICh0YXUgLSBpbmQpKih5W29yaWcraV0gLSB5aGF0W2ldKQogIH0KICAjIEFkZCB1cCB0aGUgbG9zc2VzIC0gY2hhbmdlIHRvIGxvb2sgYXQgc3VtIG9mIGxvc3Nlcy4gV29uJ3QgY2hhbmdlIGRlY2lzaW9uIGNyaXRlcmlvbgogIHN1bWxvc3MgPSBzdW0obHZlYykKICAjIHN1bWxvc3MgPSBzdW0obHZlYykvbGVuZ3RoKGx2ZWMpCiAgcmV0dXJuKGxpc3Qoc3VtbG9zcyxsdmVjKSkKfQoKCmBgYAoKCmBgYHtyfQojJyBGdW5jdGlvbiB0aGF0IHNlbGVjdHMgdGhlIG9wdGltYWwgbnVtYmVyIG9mIHByZWRpY3RvcnMKIycKIycgQHBhcmFtIHkgLSByZXNwb25zZSB2ZWN0b3IKIycgQHBhcmFtIHggLSBwcmVkaWN0b3IgdmFyaWFibGVzCiMnIEBwYXJhbSBvcmlnIC0gZm9yZWNhc3Qgb3JpZ2luCiMnIEBwYXJhbSBlbmQgLSBlbmRpbmcgb2YgdmFsaWRhdGlvbiBzZXQKIycgQHBhcmFtIHRhdSAtIFZhUiBpbiBxdWVzdGlvbgojJyBAcGFyYW0gbG93X20gLSBsb3cgdmFsdWUgb2YgbSB0byBjb25zaWRlcgojJyBAcGFyYW0gaGlnaF9tIC0gaGlnaCB2YWx1ZSBvZiBtIHRvIGNvbnNpZGVyCiMnCiMnIEByZXR1cm4gLSByZXR1cm5zIHRoZSBvcHRpbWFsIHZhbHVlIG9mIG0KIycgQGV4cG9ydAojJwojJyBAZXhhbXBsZXMgLSBvcHRfbShwY19kZlssMV0sIHBjX2RmWywtMV0sIDc1NywgMTAyNywgMC4wMSwgbG93X20gPTEsIGhpZ2hfbSAgPSA1KQpvcHRfbSA9IGZ1bmN0aW9uKHksIHgsIG9yaWcsIGVuZCA9IE5VTEwsIHRhdSwgbG93X20gPSAxLCBoaWdoX20sIG1vZF9kaSA9IDAsIGFyX3RmID0gMSwgcCA9IDEsIHByaW50X21kbCA9IDAsIG1vZGVsID0gMSwgcm93bmFtZSA9IE5VTEwpewogICMgSW5pdGlhbGl6ZSBhIGxvc3MgdmVjdG9yCiAgbG9zc192ZWMgPSByZXAoMCxoaWdoX20tbG93X20gKyAxKQogICMgSW5pdGlhbGl6ZSBhbiBtIHZlY3RvcgogIG1fdmVjID0gc2VxKGxvd19tLCBoaWdoX20sIGJ5ID0gMSkKICAjIExvb3AgdGhyb3VnaCBhbmQgcG9wdWxhdGUgdGhlIGxvc3MgdmVjdG9yCiAgZm9yIChpIGluIDE6bGVuZ3RoKGxvc3NfdmVjKSl7CiAgICBsb3NzX3ZlY1tpXSA9IHF1aWV0KGxvc3NfY2FsYyh5PXkseD14LG9yaWc9b3JpZyxlbmQ9ZW5kLCBtID0gbV92ZWNbaV0sIHRhdSA9IHRhdSwgbW9kX2RpID0gbW9kX2RpLCBhcl90ZiA9IGFyX3RmLCBwID0gcCwgcHJpbnRfbWRsID0gcHJpbnRfbWRsLCBtb2RlbCA9IG1vZGVsKSlbWzFdXQogIH0KICAjIEZpbmQgdGhlIG1pbmltaXplcgogIG9wdF9tID0gd2hpY2gubWluKGxvc3NfdmVjKQogIG9wdF9wID0gTkEKICAjIENvbWJpbmUgaW50byBhIGRhdGEgZnJhbWUKICBkZiA9IGFzLmRhdGEuZnJhbWUoY2JpbmQob3B0X20sIG9wdF9wKSkKICBuYW1lcyhkZikgPC0gYygiT3B0aW1hbCBtIiwgIk9wdGltYWwgcCIpCiAgIyBBc3NpZ24gYSByb3duYW1lCiAgaWYgKGlzLm51bGwocm93bmFtZSkgPT0gVFJVRSl7CiAgICAjIFdyaXRlIHRoZSByb3cgbmFtZXMKICAgIHJvd25hbWVzKGRmKSA8LSBjKCJNViBDQVZpYVIiKQogIH0KICBlbHNlIHsKICAgIHJvd25hbWVzKGRmKSA8LSByb3duYW1lCiAgfQogICMgUmV0dXJuIHRoZSBsb3NzX3ZlY3RvciBhbmQgdGhlIG1pbmltemVyCiAgcmV0dXJuKGxpc3Qob3B0X20sIGxvc3NfdmVjLCBkZikpCn0KYGBgCgpgYGB7cn0KIycgRnVuY3Rpb24gdGhhdCBzZWxlY3RzIHRoZSBvcHRpbWFsIG51bWJlciBvZiBsYWdzCiMnCiMnIEBwYXJhbSB5IC0gcmVzcG9uc2UgdmVjdG9yCiMnIEBwYXJhbSB4IC0gcHJlZGljdG9yIHZhcmlhYmxlcwojJyBAcGFyYW0gb3JpZyAtIGZvcmVjYXN0IG9yaWdpbgojJyBAcGFyYW0gZW5kIC0gZW5kaW5nIG9mIHZhbGlkYXRpb24gc2V0CiMnIEBwYXJhbSB0YXUgLSBWYVIgaW4gcXVlc3Rpb24KIycgQHBhcmFtIGxvd19tIC0gbG93IHZhbHVlIG9mIG0gdG8gY29uc2lkZXIKIycgQHBhcmFtIGhpZ2hfbSAtIGhpZ2ggdmFsdWUgb2YgbSB0byBjb25zaWRlcgojJwojJyBAcmV0dXJuIC0gcmV0dXJucyB0aGUgb3B0aW1hbCB2YWx1ZSBvZiBtCiMnIEBleHBvcnQKIycKIycgQGV4YW1wbGVzIC0gb3B0X21wKHkgPSBwY19kZlssMV0sIHggPSBwY19kZlssLTFdLCBvcmlnID0gNzU3LCBlbmQgPSAxMDA3LCB0YXUgPSAwLjAxLCBsb3dfbSA9MSwgaGlnaF9tICA9IDUsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsIGFyX3RmID0gMiwgbW9kX2RpID0gMSkKb3B0X21wID0gZnVuY3Rpb24oeSwgeCwgb3JpZywgZW5kID0gTlVMTCwgdGF1LCBsb3dfbSA9IDEsIGhpZ2hfbSwgbG93X3AgPSAxLCBoaWdoX3AsIG1vZF9kaSA9IDAsIGFyX3RmID0gMSwgcHJpbnRfbWRsID0gMCwgbW9kZWwgPSAxLCBwcmludF9tcCA9IDAsIHJvd25hbWUgPSBOVUxMKXsKICAjIEluaXRpYWxpemUgYSBsb3NzIG1hdHJpeAogIGxvc3NfbWF0ID0gbWF0cml4KDAsIGhpZ2hfcC1sb3dfcCArIDEsaGlnaF9tLWxvd19tICsgMSkKICAjIEluaXRpYWxpemUgYSBwIHZlY3RvcgogIHBfdmVjID0gc2VxKGxvd19wLCBoaWdoX3AsIGJ5ID0gMSkKICAjIExvb3AgdGhyb3VnaCBhbmQgcG9wdWxhdGUgdGhlIGxvc3MgdmVjdG9yCiAgZm9yIChpIGluIDE6bnJvdyhsb3NzX21hdCkpewogICAgbG9zc19tYXRbaSxdID0gb3B0X20oeSA9IHksIHggPSB4LCBvcmlnID0gb3JpZywgZW5kID0gZW5kLCB0YXUgPSB0YXUsIGxvd19tID0gbG93X20sIGhpZ2hfbSAgPSBoaWdoX20sIHAgPSBpLCBtb2RfZGkgPSBtb2RfZGksIGFyX3RmID0gYXJfdGYsIHByaW50X21kbCA9IHByaW50X21kbCwgbW9kZWwgPSBtb2RlbClbWzJdXQogIH0KICAjIEZpbmQgdGhlIG1pbmltaXplcgogIG9wdF9wID0gd2hpY2gobG9zc19tYXQgPT0gbWluKGxvc3NfbWF0KSwgYXJyLmluZCA9IFRSVUUpWzEsMV0KICBvcHRfbSA9IHdoaWNoKGxvc3NfbWF0ID09IG1pbihsb3NzX21hdCksIGFyci5pbmQgPSBUUlVFKVsxLDJdCiAgIyBQcmludCB0aGUgb3B0aW1hbCBwIGFuZCBvcHRpbWFsIG0KICBkZiA9IGFzLmRhdGEuZnJhbWUoY2JpbmQob3B0X20sIG9wdF9wKSkKICBuYW1lcyhkZikgPC0gYygiT3B0aW1hbCBtIiwgIk9wdGltYWwgcCIpCiAgIyBBc3NpZ24gYSByb3duYW1lCiAgaWYgKGlzLm51bGwocm93bmFtZSkgPT0gVFJVRSl7CiAgICBpZiAoYXJfdGYgPT0gMSl7CiAgICAgICMgV3JpdGUgdGhlIHJvdyBuYW1lcwogICAgICByb3duYW1lcyhkZikgPC0gYygiTVYgQ0FWaWFSICsgQVIiKQogICAgfSBlbHNlIGlmIChhcl90ZiA9PSAyKXsKICAgICAgIyBXcml0ZSB0aGUgcm93IG5hbWVzCiAgICAgIHJvd25hbWVzKGRmKSA8LSBjKCJNViBDQVZpYVIgKyBTQVYiKQogICAgfSBlbHNlIGlmIChhcl90ZiA9PSAzKXsKICAgICAgIyBXcml0ZSB0aGUgcm93IG5hbWVzCiAgICAgIHJvd25hbWVzKGRmKSA8LSBjKCJNViBDQVZpYVIgKyBBUyIpCiAgICB9IGVsc2UgewogICAgICByb3duYW1lcyhkZikgPC0gYygiVW5rbm93biBNb2RlbCIpCiAgICB9CiAgfQogIGVsc2UgewogICAgcm93bmFtZXMoZGYpIDwtIHJvd25hbWUKICB9CiAgIyBQcmludCB0aGUgZGYgaWYgdGhlIG9wdGlvbiBpcyB0dXJuZWQgb24KICBpZiAocHJpbnRfbXAgPT0gMSl7CiAgICBwcmludChkZikKICB9CiAgIyBSZXR1cm4gdGhlIGxvc3NfdmVjdG9yIGFuZCB0aGUgbWluaW16ZXIKICByZXR1cm4obGlzdChvcHRfbSwgb3B0X3AsIGxvc3NfbWF0LCBkZikpCn0KYGBgCgoKYGBge3J9CiMnIEEgZnVuY3Rpb24gdGhhdCBjb21iaW5lcyBvcHRpbWFsIHZhbHVlcyBvZiBtIGFuZCBwIGludG8gYSBmaW5hbCB0YWJsZQojJwojJyBAcGFyYW0gbTEgLSB0aGUgZGF0YSBmcmFtZSBmcm9tIHRoZSAiTVYgQ0FWaWFSIiBydW4KIycgQHBhcmFtIG0yIC0gdGhlIGRhdGEgZnJhbWUgZnJvbSB0aGUgIk1WIENBVmlhUiArIEFSIiBydW4KIycgQHBhcmFtIG0zIC0gdGhlIGRhdGEgZnJhbWUgZnJvbSB0aGUgIk1WIENBVmlhUiArIFNBViIgcnVuCiMnIEBwYXJhbSBtNCAtIHRoZSBkYXRhIGZyYW1lIGZyb20gdGhlICJNViBDQVZpYVIgKyBBUyIgcnVuCiMnCiMnIEByZXR1cm4gLSBhIG5pY2VseSBmb3JtYXR0ZWQgdGFibGUKIycgQGV4cG9ydAojJwojJyBAZXhhbXBsZXMgLSBwcmV0dHlfcG0ob3B0X3ByZWRfbmxbWzNdXSwgb3B0X3BtX20xW1s0XV0sIG9wdF9wbV9tMltbNF1dLCBvcHRfcG1fbTNbWzRdXSkKcHJldHR5X3BtID0gZnVuY3Rpb24obTEsIG0yLCBtMywgbTQpewogICMgTWVyZ2UgdGhlIGluZGl2aWR1YWwgZGF0YSBmcmFtZXMKICBwbV9wcmV0dHlfZGYgPSByYmluZChtMSwgbTIsIG0zLCBtNCkKICAjIEZvcm1hdCBuaWNlbHkKICBwbV9wcmV0dHlfZGYgJT4lIGthYmxlKGNhcHRpb24gPSAiT3B0aW1hbCBOdW1iZXIgb2YgRGlmZnVzaW9uIEluZGljZXMgKG0pIGFuZCBMYWdzIChwKSBmb3IgRGlmZmVyZW50IE1vZGVscyIsIGRpZ2l0cyA9IDApICU+JSBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEYpICU+JSBrYWJsZV9zdHlsaW5nKCkgJT4lIGZvb3Rub3RlKGdlbmVyYWwgPSAiVGhlIE1WIENBVmlhUiBtb2RlbCBkb2Vzbid0IGhhdmUgYW4gb3B0aW1hbCB2YWx1ZSBmb3IgcCBiZWNhdXNlIHRoZXJlIGFyZSBubyBBUiBsYWdzIGluIHRoZSBtb2RlbCIKICApCiAgCn0KCmBgYAoKCmBgYHtyfQojJyBIZXJlIGlzIGEgZnVuY3Rpb24gdGhhdCBydW5zIHRoZSB1bml2YXJpYXRlIENBVmlhUiBtb2RlbCA0IHRpbWVzCiMnCiMnIEBwYXJhbSBkZiAtIHRoZSBwZXJjZW50IGNoYW5nZSBkYXRhIGZyYW1lIHRvIGNvbnNpZGVyCiMnIEBwYXJhbSBuZmNzdCAtIG51bWJlciBvZiBmb3JlY2FzdHMgdG8gcnVuCiMnIEBwYXJhbSB0YXUgLSB0aGUgVmFSIGxldmVsIHRvIGNvbnNpZGVyCiMnIEBwYXJhbSBub19ydW4gLSBzcGVjaWZpZXMgaWYgYW55IG1vZGVscyBzaG91bGQgbm90IGJlIHJ1bgojJwojJyBAcmV0dXJuIC0gYSBsaXN0IG9mIHRoZSA0IHVuaXZhcmlhdGUgbW9kZWwgZm9yZWNhc3RzCiMnIEBleHBvcnQKIycKIycgQGV4YW1wbGVzIC0gYWNlZyA9IGdlbl91dl90ZXN0KHBjX2RmLCAxLCAwLjA1LCBub19ydW4gPSBjKDEsMSwwLDEpKQpnZW5fdXZfdGVzdCA9IGZ1bmN0aW9uKGRmLCBuZmNzdCwgdGF1LCBub19ydW4gPSBjKDAsMCwwLDApKXsKICAjIG1vZGVsIHR5cGUgKDEgLSBTQVYsIDIgLSBBUywgMyAtIEdBUkNILCA0IC0gQURBUFRJVkUpIAogICMgSW5pdGlhbGl6ZSBhIGxpc3QgIAogIG91dF9saXN0ID0gbGlzdCgpCiAgIyBSdW4gdGhlIGZvdXIgbW9kZWxzIC0gbW9kZWwgMTsgU0FWCiAgaWYgKG5vX3J1blsxXSA9PSAwKXsKICAgIHV2Y2F2XzEgPSByb2xsaW5nX3ByZWRpY3Rpb25zKGRmWywxXSwgcmFuZ2VfZGF0YSA9ICgxOmxlbmd0aChkZlssMV0pKSwgbmZjc3QgPSBuZmNzdCwgbW9kZWwgPSAxLCBHID0gMTAsIGNvbCA9IDEsIGxldmVsID0gdGF1KQogIH0KICAjIEFkZCBhIGZpbGxlciBpZiB0aGVyZSdzIG5vIGVudHJ5CiAgZWxzZSB7CiAgICB1dmNhdl8xID0gMAogIH0KICAjIE1vZGVsIDIgLSBBUwogIGlmIChub19ydW5bMl0gPT0gMCl7CiAgICB1dmNhdl8yID0gcm9sbGluZ19wcmVkaWN0aW9ucyhkZlssMV0sIHJhbmdlX2RhdGEgPSAoMTpsZW5ndGgoZGZbLDFdKSksIG5mY3N0ID0gbmZjc3QsIG1vZGVsID0gMiwgRyA9IDEwLCBjb2wgPSAxLCBsZXZlbCA9IHRhdSkKICB9CiAgZWxzZSB7CiAgICB1dmNhdl8yID0gMAogIH0KICAjIE1vZGVsIDMgLSBHQVJDSAogIGlmIChub19ydW5bM10gPT0gMCl7CiAgICB1dmNhdl8zID0gcm9sbGluZ19wcmVkaWN0aW9ucyhkZlssMV0sIHJhbmdlX2RhdGEgPSAoMTpsZW5ndGgoZGZbLDFdKSksIG5mY3N0ID0gbmZjc3QsIG1vZGVsID0gMywgRyA9IDEwLCBjb2wgPSAxLCBsZXZlbCA9IHRhdSkKICB9CiAgZWxzZSB7CiAgICB1dmNhdl8zID0gMAogIH0KICAjIE1vZGVsIDQgLSBBZGFwdGl2ZQogIGlmIChub19ydW5bNF0gPT0gMCl7CiAgICB1dmNhdl80ID0gcm9sbGluZ19wcmVkaWN0aW9ucyhkZlssMV0sIHJhbmdlX2RhdGEgPSAoMTpsZW5ndGgoZGZbLDFdKSksIG5mY3N0ID0gbmZjc3QsIG1vZGVsID0gNCwgRyA9IDEwLCBjb2wgPSAxLCBsZXZlbCA9IHRhdSkKICB9CiAgZWxzZSB7CiAgICB1dmNhdl80ID0gMAogIH0KICAjIEV4cG9ydCB0aGUgZGF0YSBhcyBhIGxpc3QKICByZXR1cm4obGlzdCh1dmNhdl8xLCB1dmNhdl8yLCB1dmNhdl8zLCB1dmNhdl80KSkKfQoKYGBgCgpgYGB7cn0KIycgRnVuY3Rpb24gdG8gcGxvdCB0aGUgZGF0YSB3aGljaCB3ZSBnZW5lcmF0ZSBpbiBwcmV2aW91cyBmdW5jdGlvbnMKIycKIycgQHBhcmFtIHBsb3RfbWF0cml4IC0gbWF0cml4IHdpdGggdGhlIGRhdGEgdG8gcGxvdAojJyBAcGFyYW0gbm9ybV92YWx1ZSAtIHdoYXQgdG8gc3VidGFjdCBmcm9tIHRoZSBkYXRhIHRvIG1ha2UgaXQgb24gYSBwZXJjZW50YWdlIGNoYW5nZSBiYXNpcy4gRGVmYXVsdCBpcyAxMDAuCiMnCiMnIEByZXR1cm4gCiMnIEBleHBvcnQgLSBhIHBsb3Qgb2YgdGhlIGRhdGEgYnkgZGlmZnVzaW9uIGluZGV4IG51bWJlcgojJwojJyBAZXhhbXBsZXMgPSBwbHRfZGF0YShwbG90X210eFtbMV1dKSwgYWJjID0gcGx0X2RhdGEocGxvdF9tYXQsIHRhdSA9IDAuMDEpCnBsdF9kYXRhID0gZnVuY3Rpb24ocGxvdF9tYXRyaXgsIHRhdSwgcmVzcF92YXIsIG50ZXN0KXsKICAjIEVzdGFibGlzaCBhIG1heGltdW0gYW5kIG1pbmltdW0gdmFsdWUKICBtYXhfdmFsID0gbWF4KHBsb3RfbWF0cml4WywxOm5jb2wocGxvdF9tYXRyaXgpXSkKICBtaW5fdmFsID0gbWluKHBsb3RfbWF0cml4WywxOm5jb2wocGxvdF9tYXRyaXgpXSkKICAjIENhbGN1bGF0ZSBpbml0YWwgYW5kIGVuZGluZyB0aW1lIHZhbHVlCiAgc3RhcnQgPSBpbmRleChwbG90X21hdHJpeClbMV0KICBlbmQgPSBpbmRleChwbG90X21hdHJpeClbbnJvdyhwbG90X21hdHJpeCldCiAgaW5kX3ZhbHMgPSBpbmRleChwbG90X21hdHJpeCkgLSBzdGFydAogICMgQ3JlYXRlIGFuIGluaXRpYWwgcGxvdCBhbmQgYWRkIGxpbmVzCiAgICBmb3IgKGkgaW4gMTpuY29sKHBsb3RfbWF0cml4KSl7CiAgICAgIGlmIChpID09IDEpewogICAgICAgICMgNC8yLzIwMjAgLSBmaXhpbmcgdGhlIGluZGV4CiAgICAgICAgcGxvdC50cyhpbmRfdmFscyxwbG90X21hdHJpeFssaV0sIHR5cGUgPSAibCIsIHhsYWIgPSBwYXN0ZSgiRGF5cyBTaW5jZSIsIGFzLkRhdGUoc3RhcnQpKSwgeWxhYiA9ICJBcHByb3guIFBlcmNlbnQgQ2hhbmdlIGluIFBHIiwgeWxpbSA9IGMobWluX3ZhbCxtYXhfdmFsKSwgbHdkID0gMSwgbWFpbiA9IHBhc3RlKCJQcmVkaWN0aW5nIiwgcmVzcF92YXIsICJSZXR1cm5zIGZyb20iLCBhcy5EYXRlKHN0YXJ0KSwgInRvIiwgYXMuRGF0ZShlbmQpKSwgc3ViID0gcGFzdGUoIlRoZSBWYVIgTGV2ZWwgaXMgIiwgMTAwKnRhdSwgIiUiLCAiOyBUaGVyZSBhcmUgIiwgbnRlc3QsICIgVHJhZGluZyBEYXlzIFBsb3R0ZWQgQWJvdmUiLCBzZXAgPSAiIikpCiAgICAgICAgIyBwbG90LnRzKGluZGV4KHBsb3RfbWF0cml4KSwgcGxvdF9tYXRyaXhbLGldLCB0eXBlID0gImwiLCB4bGFiID0gIlRyYWRpbmcgRGF5cyIsIHlsYWIgPSAiUGVyY2VudCBDaGFuZ2UgaW4gUEciLCB5bGltID0gYyhtaW5fdmFsLG1heF92YWwpLCBsd2QgPSAxLCBtYWluID0gIlByZWRpY3RpbmcgUEcgUmV0dXJucyBPdmVyIExhc3QgMjUwIFRyYWRpbmcgRGF5cyBpbiAyMDA4Iiwgc3ViID0gcGFzdGUoIlRoZSBWYVIgTGV2ZWwgaXMgIiwgMTAwKnRhdSwgIiUiLCBzZXAgPSAiIikpCiAgICB9IGVsc2UgaWYoaSAlaW4lIHNlcSgyLDgsMSkpIHsKICAgICAgICBsaW5lcyhpbmRfdmFscyxwbG90X21hdHJpeFssaV0sIGNvbCA9IGktMSwgbHR5ID0gMikKICAgIH0gZWxzZSB7CiAgICAgICAgbGluZXMoaW5kX3ZhbHMscGxvdF9tYXRyaXhbLGldLCBjb2wgPSBpLTEsIGx0eSA9IDIsIGx3ZCA9IDIpCiAgICB9CiAgICB9CiAgIyBEZWZpbmUgYSBzZXF1ZW5jZSBmb3IgcGxvdHRpbmcKICBwbG90X3NlcSA9IHNlcSgxLCBuY29sKHBsb3RfbWF0cml4KSkKICBsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQgPSBjKGNvbG5hbWVzKHBsb3RfbWF0cml4KSksIGNvbCA9IHBsb3Rfc2VxLCBsdHkgPSBjKDEsIHJlcCgyLCA3KSwgcmVwKDMsIGlmZWxzZShuY29sKHBsb3RfbWF0cml4KS04IDw9IDAsIDAsIG5jb2wocGxvdF9tYXRyaXgpLTgpKSksIGx3ZCA9IGMoMSwgcmVwKDEsIDcpLCByZXAoMiwgaWZlbHNlKG5jb2wocGxvdF9tYXRyaXgpLTggPD0gMCwgMCwgbmNvbChwbG90X21hdHJpeCktOCkpKSkKICAjIEFkZCBhIGxpbmUgZm9yIDAKICAjIGFibGluZShoID0gMCwgY29sID0gImJsYWNrIiwgbHR5ID0gMikKfQoKCmBgYAoKYGBge3J9CiMnIEEgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIGxvc3NlcyBiYXNlZCBvbiB0aGUgdGVzdCBzYW1wbGUKIycKIycgQHBhcmFtIHRydWVfdmVjIC0gdGhlIHRydWUgdmVjdG9yIG9mIHJldHVybnMKIycgQHBhcmFtIHByZWRfdmVjIC0gdGhlIHByZWRpY3RlZCB2ZWN0b3IgZnJvbSB0aGUgbW9kZWwgcnVucwojJyBAcGFyYW0gdGF1IC0gVmFSIGxldmVsLiBNdXN0IG1hdGNoIHdoYXQgdGhlIG1vZGVsIHVzZWQKIycKIycgQHJldHVybiAtIHRvdGFsIGxvc3NlcyBhbmQgdGhlIGVudGlyZSBsb3NzIHZlY3RvcgojJyBAZXhwb3J0CiMnCiMnIEBleGFtcGxlcwpsb3NzX3Rlc3QgPSBmdW5jdGlvbih0cnVlX3ZlYywgcHJlZF92ZWMsIHRhdSl7CiAgIyBJbml0aWFsaXplIGEgbG9zcyB2ZWN0b3IKICBsdmVjID0gcmVwKDAsIGxlbmd0aCh0cnVlX3ZlYykpCiAgIyBJbml0aWFsaXplIGEgYnJlYWsgdmVjdG9yIHRvIHNlZSB3aGVuIFZhUiBpcyBicm9rZW4KICBidmVjID0gcmVwKDAsIGxlbmd0aCh0cnVlX3ZlYykpCiAgZm9yIChpIGluIDE6bGVuZ3RoKHRydWVfdmVjKSl7CiAgICAjIENhbGN1bGF0ZSBhbiBpbmRpY2F0b3IgdmFyaWFibGUKICAgIGJ2ZWNbaV0gPSBpZmVsc2UodHJ1ZV92ZWNbaV0gPCBwcmVkX3ZlY1tpXSwgMSwwKQogICAgIyBVc2UgaW5kaWNhdG9yIGluIGZ1bmN0aW9uIGJlbG93CiAgICBsdmVjW2ldID0gKHRhdSAtIGJ2ZWNbaV0pKih0cnVlX3ZlY1tpXSAtIHByZWRfdmVjW2ldKQogIH0KICAjIEFkZCB1cCB0aGUgbG9zc2VzCiAgIyBzdW1sb3NzID0gc3VtKGx2ZWMpL2xlbmd0aChsdmVjKQogIHN1bWxvc3MgPSBzdW0obHZlYykKICAjIEFkZCB1cCB0aGUgVmFSIGJyZWFrYWdlCiAgdmFyYnJlYWsgPSBzdW0oYnZlYykvbGVuZ3RoKGJ2ZWMpCiAgcmV0dXJuKGxpc3Qoc3VtbG9zcyxsdmVjLCB2YXJicmVhaywgYnZlYykpCn0KYGBgCgoKCmBgYHtyfQojJyBBIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBsb3NzZXMgYmFzZWQgb24gdGhlIHBsb3QgbWF0cml4CiMnCiMnIEBwYXJhbSBkYXRhX21hdCAtIGEgbWF0cml4IG9mIGZvcmVjYXN0ZWQgVmFSIHZhbHVlcywgd2l0aCB0aGUgdHJ1ZSB2YWx1ZSBpbiB0aGUgZmlyc3QgY29sdW1uCiMnIEBwYXJhbSB0YXUgLSBWYVIgbGV2ZWwuIE11c3QgbWF0Y2ggd2hhdCB0aGUgbW9kZWwgdXNlZAojJwojJyBAcmV0dXJuIC0gYSBsaXN0IG9mIGZvdXIgaXRlbXMuIAojJyAxID0gYSB2ZWN0b3Igb2YgdGhlIGxvc3NlcyBvZiBhbGwgbW9kZWxzLiAKIycgMiA9IGEgdmVjdG9yIHNob3dpbmcgdGhlIHBlcmNlbnRhZ2Ugb2YgVmFSIGJyZWFrcyBieSBtb2RlbAojJyAzID0gdGhlIGxvc3MgbWF0cml4CiMnIDQgPSB0aGUgYnJlYWsgbWF0cml4CiMnIEBleHBvcnQKIycKIycgQGV4YW1wbGVzCmdlbl9sb3NzX3Rlc3QgPSBmdW5jdGlvbihkYXRhX21hdCwgdGF1KXsKICAjIEluaXRpYWxpemUgbG9zcyBhbmQgYnJlYWsgbWF0cmljZXMKICBsbWF0ID0gYm1hdCA9IG1hdHJpeCgwLCBucm93ID0gbnJvdyhkYXRhX21hdCksIG5jb2wgPSBuY29sKGRhdGFfbWF0KS0xKQogICMgYnZlYyA9IHJlcCgwLCBsZW5ndGgodHJ1ZV92ZWMpKQogICMgUG9wdWxhdGUgdGhlIG1hdHJpY2VzCiAgZm9yIChpIGluIDE6bnJvdyhsbWF0KSl7CiAgICBmb3IgKGogaW4gMToobmNvbChsbWF0KSkpewogICAgICAjIENhbGN1bGF0ZSBhbiBpbmRpY2F0b3IgdmFyaWFibGUKICAgICAgYm1hdFtpLGpdID0gaWZlbHNlKGRhdGFfbWF0W2ksMV0gPCBkYXRhX21hdFtpLGorMV0sIDEsMCkKICAgICAgIyBVc2UgaW5kaWNhdG9yIGluIGZ1bmN0aW9uIGJlbG93CiAgICAgIGxtYXRbaSxqXSA9ICh0YXUgLSBibWF0W2ksal0pKihkYXRhX21hdFtpLDFdIC0gZGF0YV9tYXRbaSxqKzFdKQogICAgfSAgICAKICB9CiAgIyBBZGQgdXAgdGhlIGxvc3NlcwogIHN1bWxvc3MgPSBjb2xTdW1zKGxtYXQpCiAgIyBBZGQgdXAgdGhlIFZhUiBicmVha2FnZQogIHZhcmJyZWFrID0gY29sU3VtcyhibWF0KS9ucm93KGJtYXQpCiAgcmV0dXJuKGxpc3Qoc3VtbG9zcywgdmFyYnJlYWssIGxtYXQsIGJtYXQpKQp9CmBgYAoKCgpgYGB7cn0KIycgQSBmdW5jdGlvbiB0byBtYWtlIGEgbmljZSBjb21wYXJpc29uIG9mIGxvc3NlcwojJwojJyBAcGFyYW0gZGF0YV9tYXQgLSBpbnB1dCBkYXRhIG1hdHJpeCB1c2VkIGluIHRoZSBjYWxjdWxhdGlvbiBvZiBsb3NzZXMKIycgQHBhcmFtIGxvc3NfbGlzdCAtIGEgbGlzdCBvZiB0aGUgbG9zc2VzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgQ0FWaWFSIGZ1bmN0aW9uCiMnIEBwYXJhbSB0YXUgLSB0aGUgcmlzayBsZXZlbCB1c2VkCiMnIEBwYXJhbSBudGVzdCAtIHRoZSBudW1iZXIgb2YgdGVzdCBwb2ludHMKIycKIycgQHJldHVybgojJyBAZXhwb3J0IC0gcmV0dXJucyBhIG5pY2VseSBmb3JtYXR0ZWQgdGFibGUKIycKIycgQGV4YW1wbGVzIC0gcHJldHR5X3RhYmxlcyhwbG90X21hdCwgbF9saXN0LCB0YXUgPSAwLjAxKQpwcmV0dHlfdGFibGVzID0gZnVuY3Rpb24oZGF0YV9tYXQsIGxvc3NfbGlzdCwgdGF1LCBudGVzdCl7CiAgIyBDb21iaW5lIGludG8gYSBkYXRhIGZyYW1lCiAgZGYgPSBhcy5kYXRhLmZyYW1lKHJiaW5kKGxvc3NfbGlzdFtbMV1dLCBsb3NzX2xpc3RbWzJdXSkpCiAgIyBDYWxjdWxhdGUgaW5pdGFsIGFuZCBlbmRpbmcgdGltZSB2YWx1ZQogIHN0YXJ0ID0gaW5kZXgoZGF0YV9tYXQpWzFdCiAgZW5kID0gaW5kZXgoZGF0YV9tYXQpW25yb3coZGF0YV9tYXQpXQogICMgQWRkIHJvdy9jb2x1bW4gbmFtZXMKICBjb2xuYW1lcyhkZikgPC0gY29sbmFtZXMoZGF0YV9tYXRbLC0xXSkKICByb3duYW1lcyhkZikgPC0gYygiTG9zc2VzIiwgIlZhUiBCcmVha3MgKCUpIikKICAjIEVkaXRzIG9uIDUuMTIuMjAyMCAtIGRpdmlkZSB0aGUgdGFibGUgaW50byAyCiAgdXZfZGYgPSBkZlssMTo0XQogIG12X2RmID0gZGZbLDU6OF0KICAjIHByaW50KHV2X2RmKQogICMgcHJpbnQobXZfZGYpCiAgIyBDb252ZXJ0IHRvIHRhYmxlCiAgcHJpbnQodXZfZGYgJT4lIGthYmxlKGNhcHRpb24gPSBwYXN0ZSgiVW5pdmFyaWF0ZSBDQVZpYVIgUmVzdWx0cyBmb3IgYSAiLCB0YXUqMTAwLCAiJSBWYVIiLCBzZXAgPSAiIiksIGRpZ2l0cyA9IDMpICU+JSBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEYpICU+JSBrYWJsZV9zdHlsaW5nKCkgJT4lIGZvb3Rub3RlKGdlbmVyYWwgPSBwYXN0ZSgiQ2FsY3VsYXRlZCB1c2luZyIsIG50ZXN0LCAidHJhZGluZyBkYXlzIGZyb20iLCBhcy5EYXRlKHN0YXJ0KSwgInRvIiwgYXMuRGF0ZShlbmQpKSkpCiAgcHJpbnQobXZfZGYgJT4lIGthYmxlKGNhcHRpb24gPSBwYXN0ZSgiTXVsdGl2YXJpYXRlIENBVmlhUiBSZXN1bHRzIGZvciBhICIsIHRhdSoxMDAsICIlIFZhUiIsIHNlcCA9ICIiKSwgZGlnaXRzID0gMykgJT4lIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRikgJT4lIGthYmxlX3N0eWxpbmcoKSAlPiUgZm9vdG5vdGUoZ2VuZXJhbCA9IHBhc3RlKCJDYWxjdWxhdGVkIHVzaW5nIiwgbnRlc3QsICJ0cmFkaW5nIGRheXMgZnJvbSIsIGFzLkRhdGUoc3RhcnQpLCAidG8iLCBhcy5EYXRlKGVuZCkpKSkKICAjIENvbnZlcnQgdG8gYSB0YWJsZQogICMgZGYgJT4lIGthYmxlKGNhcHRpb24gPSBwYXN0ZSgiQ29tcGFyaXNvbiBvZiBWYVIgTWV0aG9kcyBmb3IgYSAiLCB0YXUqMTAwLCAiJSBWYVIiLCBzZXAgPSAiIiksIGRpZ2l0cyA9IDMpICU+JSBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEYpICU+JSBrYWJsZV9zdHlsaW5nKCkgJT4lIGZvb3Rub3RlKGdlbmVyYWwgPSBwYXN0ZSgiQ2FsY3VsYXRlZCB1c2luZyIsIG50ZXN0LCAidHJhZGluZyBkYXlzIGZyb20iLCBhcy5EYXRlKHN0YXJ0KSwgInRvIiwgYXMuRGF0ZShlbmQpKSkKICAjIGNjX2RmWy0oMToyKSxdICU+JSBrYWJsZShjYXB0aW9uID0gIkFjY3VyYWN5IG9mIFZhUiBGb3JlY2FzdCBmb3IgUEcgT3ZlciBMYXN0IDIwMCBUcmFkaW5nIERheXMgaW4gMjAwOCIsIGRpZ2l0cyA9IDMpICU+JSBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGKSAlPiUgZm9vdG5vdGUoZ2VuZXJhbCA9ICJUZXN0ZWQgVXNpbmcgdGhlIFN5bW1ldHJpYyBBYnNvbHV0ZSBWYWx1ZSBNb2RlbCIpCn0KYGBgCgpgYGB7cn0KIycgQSBkcmVzc2VkIHVwIHZlcnNpb24gb2YgdGhlIGV4cG9ydCBmdW5jdGlvbgojJwojJyBAcGFyYW0gdmFyX2ZpbGUgLSBmaWxlIHRvIGV4cG9ydAojJyBAcGFyYW0gcGF0aCAtIGZpbGVwYXRoCiMnIEBwYXJhbSBmaWxlbmFtZSAtIG5hbWUgb2YgdGhlIGZpbGUsIGVuZGluZyB3aXRoIC5DU1YKIycKIycgQHJldHVybgojJyBAZXhwb3J0IC0gZXhwb3J0ZWQgQ1NWIGZpbGUKIycKIycgQGV4YW1wbGVzIC0gZXhwX2Z1bmModmFyX2ZpbGUgPSB2YXJfMXBjXzIwMTZfdXNldGZbWzFdXSwgcGF0aCA9ICIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX1VTX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gIlRFU1QuY3N2IikKZXhwX2Z1bmMgPSBmdW5jdGlvbih2YXJfZmlsZSwgcGF0aCwgZmlsZW5hbWUpewogICMgV3JpdGUgYSB6b28KICB3cml0ZS56b28odmFyX2ZpbGUsIHBhc3RlMChwYXRoLCBmaWxlbmFtZSksIHF1b3RlID0gRkFMU0UsIHNlcCA9ICIsIikKfQoKIyBleHBfZnVuYyh2YXJfZmlsZSA9IHZhcl8xcGNfMjAxNl91c2V0ZltbMV1dLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfVVNfRVRGX3J1bnMvIiwgZmlsZW5hbWUgPSAiVEVTVC5jc3YiKQoKYGBgCgoKCgojIEJpZyBTaW11bGF0aW9uIEZ1bmN0aW9uCgpgYGB7cn0KIycgVGhpcyBpcyB0aGUgIm1hc3RlciIgZnVuY3Rpb24gd2hlcmUgd2UnbGwgZXZhbHVhdGUgdGhlIGltcG9ydGFuY2Ugb2YgdGhlIFZhUiBtb2RlbCBvdmVyIHNldmVyYWwgdGltZSBwZXJpb2RzCiMnCiMnIEBwYXJhbSBzeW1ib2xfbGlzdCAtIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGZlZWQgaW50byB0aGUgbW9kZWwgCiMnIEBwYXJhbSByZXNwX3ZhciAtIHRoZSByZXNwb25zZSB2YXJpYWJsZQojJyBAcGFyYW0gY29tcGxfY2FzZSAtIHNob3VsZCB0aGUgbW9kZWwgcmVxdWlyZSBjb21wbGV0ZSBjYXNlcz8gRGVmYXVsdCB2YWx1ZSBpcyAxLgojJyBAcGFyYW0gYWRqX2Nsb3NlIC0gdXNlIGFkanVzdGVkIGNsb3NlIHByaWNlIGZvciB0aGUgcHJlZGljdG9ycz8gRGVmYXVsdCB2YWx1ZSBpcyAxLgojJyBAcGFyYW0gcmVzcF9hZGpfY2xvc2UgLSB1c2UgYWRqdXN0ZWQgY2xvc2UgcHJpY2UgZm9yIHRoZSByZXNwb25zZT8gRGVmYXVsdCB2YWx1ZSBpcyAxLgojJyBAcGFyYW0gc3RhcnRfZGF0ZSAtIHN0YXJ0IGRhdGUgdG8gcHVsbCBkYXRhIGZyb20KIycgQHBhcmFtIGVuZF9kYXRlIC0gZW5kIGRhdGUgdG8gcHVsbCBkYXRhIGZyb20KIycgQHBhcmFtIG52YWwgLSBudW1iZXIgb2YgdmFsaWRhdGlvbiBwb2ludHMgdG8gdXNlCiMnIEBwYXJhbSBudGVzdCAtIG51bWJlciBvZiB0ZXN0IHBvaW50cyB0byB1c2UKIycgQHBhcmFtIHRhdSAtIFZhUiBsZXZlbCB0byB1c2UKIycgQHBhcmFtIGxvd19tIC0gbG93IG51bWJlciBvZiBwcmVkaWN0b3JzIHRvIHRlc3QKIycgQHBhcmFtIGhpZ2hfbSAgLSBsb3cgbnVtYmVyIG9mIHByZWRpY3RvcnMgdG8gdGVzdAojJyBAcGFyYW0gdXZfbGlzdCAtIGEgbGlzdCBvZiBhIHByZS1ydW4gdW5pdmFyaWF0ZSBtb2RlbC4gSWYgYSBkYXRhIGZyYW1lIGlzIG5vdCBwcm92aWRlZCwgdGhlIGxlbmd0aHkgdXYgbW9kZWwgd2lsbCBydW4gCiMnIEBwYXJhbSBub19ydW4gLSB0aGluZ3Mgbm90IHRvIHJ1biBpbiB0aGUgbW9kZWwKIycgQHBhcmFtIGxvd19wIC0gbG93IHZhbHVlIGZvciBudW1iZXIgb2YgbGFncwojJyBAcGFyYW0gaGlnaF9wIC0gaGlnaCB2YWx1ZSBmb3IgbnVtYmVyIG9mIGxhZ3MKIycgQHBhcmFtIG5hX2ludGVycCAtIHNob3VsZCB0aGUgZnVuY3Rpb24gaW50ZXJwb2xhdGUgTkEncwojJyBAcGFyYW0gcHJpbnRfbWRsIC0gcHJpbnQgdGhlIG1vZGVsIHN1bW1hcmllcz8KIycgQHBhcmFtIHByaW50X21wIC0gcHJpbnQgdGhlIG9wdGltYWwgdmFsdWVzIGZvciBwIGFuZCBtCiMnIEBwYXJhbSBsYWdfcHJlZCAtIGRvIHlvdSB3YW50IHRvIGxhZyB0aGUgbSBwcmVkaWN0b3JzIChkZWZhdWx0IGlzIDE7IHN0cm9uZ2x5IHJlY29tbWVuZGVkKQojJyBAcGFyYW0gcm93bmFtZSAtIHdoYXQgdG8gbmFtZSB0aGUgcm93cyBvZiB0aGUgbmljZSBwIGFuZCBtIG1hdHJpeAojJyBAcGFyYW0gZXhwb3J0X2NzdiAtIGRvIHlvdSB3YW50IHRvIGV4cG9ydCBhIENTVj8gRGVmYXVsdCBpcyAxLgojJyBAcGFyYW0gcGF0aCAtIHBhdGggdG8gZXhwb3J0IHRoZSBDU1YKIycgQHBhcmFtIGZpbGVuYW1lIC0gd2hhdCB0byBuYW1lIHRoZSBDU1YKIycKIycgQHJldHVybiAtIGEgbGlzdCBvZiB0aGUgcGxvdCBtYXRyaXgsIGEgcGxvdCwgYSBsaXN0IHdpdGggbG9zc2VzLCBhbmQgYSB0YWJsZQojJyBAZXhwb3J0IC0gYSBwbG90IGFuZCBhIHRhYmxlCiMnCiMnIEBleGFtcGxlcyAtIGNhdl9zaW11bChjKCJESVMiLCAiR0UiLCAiSUJNIiwgIk1NTSIsICJYT00iKSwgcmVzcF92YXIgPSAiUEciLCBzdGFydF9kYXRlID0gIjIwMDQtMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDA4LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gNSwgdGF1ID0gMC4wMSwgdXZfbGlzdCA9IHV2X2Nhdl9saXN0KQpjYXZfc2ltdWwgPSBmdW5jdGlvbihzeW1ib2xfbGlzdCwgcmVzcF92YXIsIGNvbXBsX2Nhc2UgPSAxLCBhZGpfY2xvc2UgPSAxLCByZXNwX2Fkal9jbG9zZSA9IDEsIHN0YXJ0X2RhdGUgPSAiMTkwMC0wMS0wMSIsIGVuZF9kYXRlID0gU3lzLkRhdGUoKSwgbnZhbCwgbnRlc3QsIHRhdSwgbG93X20gPSAxLCBoaWdoX20sIGxvd19wID0gMSwgaGlnaF9wLCB1dl9saXN0ID0gTlVMTCwgbm9fcnVuID0gYygwLDAsMCwwKSwgbmFfaW50ZXJwID0gVFJVRSwgcHJpbnRfbWRsID0gMCwgcHJpbnRfbXAgPSAwLCBsYWdfcHJlZCA9IDEsIHJvd25hbWUgPSBOVUxMLCBleHBvcnRfY3N2ID0gMSwgcGF0aCwgZmlsZW5hbWUpewogICMgU2VsZWN0IGRhdGEgcGFyYW1ldGVycywgcHVsbCB0aGUgZGF0YSwgYW5kIHBlcmNlbnQgY2hhbmdlIHRoZSBkYXRhCiAgZGYgPSBkaWZmX2luZGV4X2RmKHN5bWJvbF9saXN0ID0gc3ltYm9sX2xpc3QsIHJlc3BfdmFyID0gcmVzcF92YXIsIGNvbXBsX2Nhc2UgPSBjb21wbF9jYXNlLCBhZGpfY2xvc2UgPSBhZGpfY2xvc2UsIHJlc3BfYWRqX2Nsb3NlID0gcmVzcF9hZGpfY2xvc2UsIHN0YXJ0X2RhdGUgPSBzdGFydF9kYXRlLCBlbmRfZGF0ZSA9IGVuZF9kYXRlLCBsYWdfcHJlZCA9IGxhZ19wcmVkKQogICMgVGFrZSB0aGUgcGVyY2VudCBjaGFuZ2Ugb2YgdGhlIGRhdGEKICBwY19kZiA9IHBjX2RpZmZfaW5kZXgoZGYpCiAgIyBFeHRyYWN0IHRoZSBsZWdudGggb2YgdGhlIGRhdGEgZnJhbWUKICBuciA9IHRlc3RfZW5kID0gbnJvdyhwY19kZikKICAjIENhbGN1bGF0ZSB0aGUgc3RhcnQgb2YgdGhlIHZhbCBwZXJpb2QsIHRoZSBlbmQgb2YgdGhlIHZhbCBwZXJpb2QsIGFuZCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGVzdCBwZXJpb2QKICB0ZXN0X29yaWcgPSB0ZXN0X2VuZCAtIG50ZXN0CiAgdmFsX2VuZCA9IHRlc3Rfb3JpZwogIHZhbF9vcmlnID0gdGVzdF9vcmlnIC0gbnZhbAogICMgVGVzdCBmb3IgdGhlIG9wdGltYWwgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICBvcHRfcHJlZF9ubCA9IG9wdF9tKHkgPSBwY19kZlssMV0sIHggPSBwY19kZlssLTFdLCBvcmlnID0gdmFsX29yaWcsIGVuZCA9IHZhbF9lbmQsIHRhdSA9IHRhdSwgbG93X20gPSBsb3dfbSwgaGlnaF9tID0gaGlnaF9tLCByb3duYW1lID0gcm93bmFtZSkKICBvcHRfcHJlZF9hcnQxID0gb3B0X21wKHkgPSBwY19kZlssMV0sIHggPSBwY19kZlssLTFdLCBvcmlnID0gdmFsX29yaWcsIGVuZCA9IHZhbF9lbmQsIHRhdSA9IHRhdSwgbG93X20gPSBsb3dfbSwgaGlnaF9tID0gaGlnaF9tLCBsb3dfcCA9IGxvd19wLCBoaWdoX3AgPSBoaWdoX3AsbW9kX2RpID0gMSwgYXJfdGYgPSAxLCBwcmludF9tZGwgPSBwcmludF9tZGwsIHByaW50X21wID0gcHJpbnRfbXAsIHJvd25hbWUgPSByb3duYW1lKQogIG9wdF9wcmVkX2FydDIgPSBvcHRfbXAoeSA9IHBjX2RmWywxXSwgeCA9IHBjX2RmWywtMV0sIG9yaWcgPSB2YWxfb3JpZywgZW5kID0gdmFsX2VuZCwgdGF1ID0gdGF1LCBsb3dfbSA9IGxvd19tLCBoaWdoX20gPSBoaWdoX20sIGxvd19wID0gbG93X3AsIGhpZ2hfcCA9IGhpZ2hfcCxtb2RfZGkgPSAxLCBhcl90ZiA9IDIsIHByaW50X21kbCA9IHByaW50X21kbCwgcHJpbnRfbXAgPSBwcmludF9tcCwgcm93bmFtZSA9IHJvd25hbWUpCiAgb3B0X3ByZWRfYXJ0MyA9IG9wdF9tcCh5ID0gcGNfZGZbLDFdLCB4ID0gcGNfZGZbLC0xXSwgb3JpZyA9IHZhbF9vcmlnLCBlbmQgPSB2YWxfZW5kLCB0YXUgPSB0YXUsIGxvd19tID0gbG93X20sIGhpZ2hfbSA9IGhpZ2hfbSwgbG93X3AgPSBsb3dfcCwgaGlnaF9wID0gaGlnaF9wLCBtb2RfZGkgPSAxLCBhcl90ZiA9IDMsIHByaW50X21kbCA9IHByaW50X21kbCwgcHJpbnRfbXAgPSBwcmludF9tcCwgcm93bmFtZSA9IHJvd25hbWUpCiAgIyBnZW5fdXZfdGVzdChwY19kZiwgMSwgMC4wNSwgbm9fcnVuID0gYygxLDEsMCwxKSkKICAjIFVzZSB0aGUgYWJvdmUgZm9yZWNhc3RzIHRvIGlucHV0IGludG8gdGhlIGFib3ZlCiAgbXZfZmNzdCA9IG1vZF9kaShwY19kZlssMV0sIHBjX2RmWywtMV0sIG9yaWcgPSB0ZXN0X29yaWcsIG0gPSBvcHRfcHJlZF9ubFtbMV1dLCB0YXUgPSB0YXUsIHByaW50X21kbCA9IHByaW50X21kbCkKICBtdl9mY3N0X2FydDEgPSBtb2RfZGlfd2wocGNfZGZbLDFdLCBwY19kZlssLTFdLCBvcmlnID0gdGVzdF9vcmlnLCBtID0gb3B0X3ByZWRfYXJ0MVtbMV1dLCBwID0gb3B0X3ByZWRfYXJ0MVtbMl1dLCB0YXUgPSB0YXUsIGFyX3RmID0gMSwgcHJpbnRfbWRsID0gcHJpbnRfbWRsKQogIG12X2Zjc3RfYXJ0MiA9IG1vZF9kaV93bChwY19kZlssMV0sIHBjX2RmWywtMV0sIG9yaWcgPSB0ZXN0X29yaWcsIG0gPSBvcHRfcHJlZF9hcnQyW1sxXV0sIHAgPSBvcHRfcHJlZF9hcnQyW1syXV0sIHRhdSA9IHRhdSwgYXJfdGYgPSAyLCBwcmludF9tZGwgPSBwcmludF9tZGwpCiAgbXZfZmNzdF9hcnQzID0gbW9kX2RpX3dsKHBjX2RmWywxXSwgcGNfZGZbLC0xXSwgb3JpZyA9IHRlc3Rfb3JpZywgbSA9IG9wdF9wcmVkX2FydDNbWzFdXSwgcCA9IG9wdF9wcmVkX2FydDNbWzJdXSwgdGF1ID0gdGF1LCBhcl90ZiA9IDMsIHByaW50X21kbCA9IHByaW50X21kbCkKICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHByZWRpY3Rpb25zCiAgaWYgKGlzLm51bGwodXZfbGlzdCkgPT0gVFJVRSl7CiAgICAjIFByaW50IGEgd2FybmluZwogICAgcHJpbnQoIldBUk5JTkc6IE5vdCBzdXBwbHlpbmcgYW4gaW5wdXQgZGF0YSBmcmFtZSB3aWxsIHJlcXVpcmUgdGhpcyBmdW5jdGlvbiB0byBydW4gZm9yIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHRpbWUgKDFocispIikKICAgICMgQ2FsbCB0aGUgZnVuY3Rpb24KICAgICMgZ2VuX3V2X3Rlc3QgPSBmdW5jdGlvbihkZiwgbmZjc3QsIHRhdSwgbm9fcnVuID0gYygwLDAsMCwwKSl7CiAgICAjIHByaW50KGhlYWQocGNfZGYpKQogICAgdXZfbGlzdCA9IGdlbl91dl90ZXN0KGRmID0gcGNfZGYsIG5mY3N0ID0gbnRlc3QsIHRhdSA9IHRhdSwgbm9fcnVuID0gbm9fcnVuKQogICAgIyBBZGQgdG8gYSBkYXRhIGZyYW1lCiAgICAjIEluY29ycG9yYXRlIHRoZSByb2xsaW5nIHByZWRpY3Rpb25zIGZ1bmN0aW9uIHJlc3VsdHMgaGVyZQogIHBsb3RfbWF0ID0gY2JpbmQocGNfZGZbKHRlc3Rfb3JpZysxKTpucm93KHBjX2RmKSwxXSwgbXZfZmNzdCR5aGF0WzE6bnRlc3RdLCBtdl9mY3N0X2FydDEkeWhhdFsxOm50ZXN0XSwgbXZfZmNzdF9hcnQyJHloYXRbMTpudGVzdF0sIG12X2Zjc3RfYXJ0MyR5aGF0WzE6bnRlc3RdLCB1dl9saXN0W1sxXV1bKHRlc3Rfb3JpZysxKTp0ZXN0X2VuZF0qKC0xKSwgdXZfbGlzdFtbMl1dWyh0ZXN0X29yaWcrMSk6dGVzdF9lbmRdKigtMSksIHV2X2xpc3RbWzNdXVsodGVzdF9vcmlnKzEpOnRlc3RfZW5kXSooLTEpLCB1dl9saXN0W1s0XV1bKHRlc3Rfb3JpZysxKTp0ZXN0X2VuZF0qKC0xKSkKICB9IGVsc2UgewogICAgIyBBc3NpZ24gdGhlIGNvbHVtbnMgb2YgdGhlIGRhdGEgZnJhbWUKICAgICMgaGVhZCh2YXJfNXBjXzIwMTBfdXNldGZbWzFdXVssNjo5XSkKICAgICMgbW9kZWwgdHlwZSAoMSAtIFNBViwgMiAtIEFTLCAzIC0gR0FSQ0gsIDQgLSBBREFQVElWRSkgCiAgICAjIHRlc3RfZGYgPSBoZWFkKHZhcl81cGNfMjAxMF91c2V0ZltbMV1dWyw2OjldKQogICAgIyB0ZXN0X2RmJFNBVgogICAgIyB0ZXN0X2RmJGBBYnMuIFNsb3BlYAogICAgIyB0ZXN0X2RmJGBJbmQuIEdBUkNIYAogICAgIyB0ZXN0X2RmJEFkYXB0aXZlCiAgICBwbG90X21hdCA9IGNiaW5kKHBjX2RmWyh0ZXN0X29yaWcrMSk6bnJvdyhwY19kZiksMV0sIG12X2Zjc3QkeWhhdFsxOm50ZXN0XSwgbXZfZmNzdF9hcnQxJHloYXRbMTpudGVzdF0sIG12X2Zjc3RfYXJ0MiR5aGF0WzE6bnRlc3RdLCBtdl9mY3N0X2FydDMkeWhhdFsxOm50ZXN0XSwgdXZfbGlzdCRTQVYsIHV2X2xpc3QkYEFicy4gU2xvcGVgLCB1dl9saXN0JGBJbmQuIEdBUkNIYCwgdXZfbGlzdCRBZGFwdGl2ZSkKICB9CiAgIyBDb3VudCB0aGUgTkFzIGFuZCBwcmludCBhIHdhcm5pbmcKICBwcmludChwYXN0ZSgiTk9URTogVGhlcmUgYXJlICIsIHN1bShpcy5uYShwbG90X21hdCkpLCAiIE5BKHMpIGluIHRoZSBkYXRhc2V0Iiwgc2VwID0gIiIpKQogICMgTGluZWFybHkgaW50ZXJwb2xhdGUgdGhlIE5BcwogIGlmIChuYV9pbnRlcnAgPT0gVFJVRSl7CiAgICAjIEFzc2lnbiB0aGUgcGxvdCBtYXRyaXggdG8gYSBuZXcgdmFsdWUKICAgIHBsb3RfbWF0X25hIDwtIHBsb3RfbWF0CiAgICAjIFByaW50IGEgd2FybmluZwogICAgcHJpbnQoIldBUk5JTkc6IFRoZXJlIHdlcmUgbWlzc2luZyB2YWx1ZXMgaW4gdGhlIHBsb3QgbWF0cml4LiIpCiAgICAjIEludGVycG9sYXRlIHRoZSBOQSdzCiAgICBmb3IgKGkgaW4gMTpuY29sKHBsb3RfbWF0X25hKSl7CiAgICAgICMgSW50ZXJwb2xhdGUgdGhlIGRhdGEKICAgICAgcGxvdF9tYXRbLGldIDwtIG5hLmFwcHJveChwbG90X21hdF9uYVssaV0pCiAgICB9CiAgfQogICMgbW9kZWwgdHlwZSAoMSAtIFNBViwgMiAtIEFTLCAzIC0gR0FSQ0gsIDQgLSBBREFQVElWRSkKICAjIEFkZCBkZXNjcmlwdGl2ZSB0aXRsZXMgb250byB0aGUgcGxvdF9tYXQKICBjb2xuYW1lcyhwbG90X21hdCkgPC0gYyhyZXNwX3ZhciwgIk1WIENBVmlhUiIsICJNViBDQVZpYVIgKyBBUiIsICJNViBDQVZpYVIgKyBTQVYiLCAiTVYgQ0FWaWFSICsgQVMiLCAiU0FWIiwgIkFicy4gU2xvcGUiLCAiSW5kLiBHQVJDSCIsICJBZGFwdGl2ZSIpCiAgIyBjb2xuYW1lcyhwbG90X21hdCkgPC0gYygiU1BZIiwgIk1WIENBVmlhUiIsICJNViBDQVZpYVIgKyBBUiIsICJNViBDQVZpYVIgKyBTQVYiLCAiTVYgQ0FWaWFSICsgQVMiLCAiU0FWIiwgIkFicy4gU2xvcGUiLCAiSW5kLiBHQVJDSCIsICJBZGFwdGl2ZSIpCiAgIyBQbG90IGV2ZXJ5dGhpbmcKICBwbG90ID0gcGx0X2RhdGEocGxvdF9tYXQsIHRhdSA9IHRhdSwgcmVzcF92YXIgPSByZXNwX3ZhciwgbnRlc3QgPSBudGVzdCkKICAjIENhbGN1bGF0ZSBsb3NzZXMKICBsX2xpc3QgPSBnZW5fbG9zc190ZXN0KHBsb3RfbWF0LCB0YXUgPSB0YXUpCiAgIyBQdXQgaW50byB0YWJsZXMKICB0YWJsZXMgPSBwcmV0dHlfdGFibGVzKHBsb3RfbWF0LCBsX2xpc3QsIHRhdSA9IHRhdSwgbnRlc3QgPSBudGVzdCkKICAjIFJ1biB0aGUgZnVuY3Rpb24gZm9yIG9wdGltYWwgcCBhbmQgbQogIHBtX3RhYmxlID0gcHJldHR5X3BtKG9wdF9wcmVkX25sW1szXV0sIG9wdF9wcmVkX2FydDFbWzRdXSwgb3B0X3ByZWRfYXJ0MltbNF1dLCBvcHRfcHJlZF9hcnQzW1s0XV0pCiAgIyBFeHBvcnQgdGhlIG1hdHJpeAogIGlmIChleHBvcnRfY3N2ID09IDEpewogICAgZXhwX2Z1bmModmFyX2ZpbGUgPSBwbG90X21hdCwgcGF0aCwgZmlsZW5hbWUpCiAgfQogICMgUHJpbnQgdGhlIHRhYmxlcyBhbmQgdGhlIHBsb3QKICBwcmludChwbG90KQogIHByaW50KHRhYmxlcykKICBwcmludChwbV90YWJsZSkKICByZXR1cm4obGlzdChwbG90X21hdCwgcGxvdCwgbF9saXN0LCB0YWJsZXMsIHBsb3RfbWF0X25hLCBwbV90YWJsZSkpCn0KYGBgCgoKCmBgYHtyfQojJyBBIGZ1bmN0aW9uIHRvIGlucHV0IHRoZSBWYVIgZmlsZXMsIHBsb3QgdGhlbSBhbmQgZ2VuZXJhdGUgdGFibGVzCiMnCiMnIEBwYXJhbSBmaWxlX3BhdGggLSBmaWxlIHBhdGggdG8gdXNlCiMnIEBwYXJhbSBmaWxlbmFtZSAtIG5hbWUgb2YgdGhlIGZpbGUKIycgQHBhcmFtIHRhdSAtIHF1YW50aWxlIHRvIHVzZQojJyBAcGFyYW0gcmVzcF92YXIgLSByZXNwb25zZSB2YXJpYWJsZSB0byB1c2UgaW4gdGhlIHBsb3QKIycgQHBhcmFtIG50ZXN0IC0gbnVtYmVyIG9mIHRlc3QgcG9pbnRzCiMnIEBwYXJhbSBjbl9pbnB1dCAtIGNvbHVtbiBuYW1lIGlucHV0cwojJwojJyBAcmV0dXJuIC0gYSBsaXN0IG9mIHRoZSB4dHMgZmlsZSwgdGhlIHBsb3QsIHRoZSBsb3NzIGxpc3QsIGFuZCB0YWJsZXMKIycgQGV4cG9ydCAtIGEgcGxvdCBhbmQgdGFibGVzCiMnCiMnIEBleGFtcGxlcyAtIHRlc3QgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9VU19FVEZfcnVucy8iLCJ2YXJfMXBjXzIwMDhfdXNfZXRmLmNzdiIsIDAuMDEpCnZhcl9pbnB1dF9kaXNwID0gZnVuY3Rpb24oZmlsZV9wYXRoLCBmaWxlbmFtZSwgdGF1LCByZXNwX3ZhciA9ICJTUFkiLCBudGVzdCA9IDI1MCwgY25faW5wdXQgPSBjKCJTUFkiLCAiTVYgQ0FWaWFSIiwgIk1WIENBVmlhUiArIEFSIiwgIk1WIENBVmlhUiArIFNBViIsICJNViBDQVZpYVIgKyBBUyIsICJTQVYiLCAiQWJzLiBTbG9wZSIsICJJbmQuIEdBUkNIIiwgIkFkYXB0aXZlIikpewojIHZhcl9pbnB1dF9kaXNwID0gZnVuY3Rpb24oZmlsZV9wYXRoLCBmaWxlbmFtZSwgdGF1LCByZXNwX3ZhciA9ICJTUFkiLCBudGVzdCA9IDI1MCwgY25faW5wdXQgPSBjKCJTUFkiLCAiTVYgQ0FWaWFSIiwgIk1WIENBVmlhUiArIEFSIiwgIk1WIENBVmlhUiArIFNBViIsICJNViBDQVZpYVIgKyBBUyIsICJTQVYiLCAiQWJzLiBTbG9wZSIsICJJbmQuIEdBUkNIIiwgIkFkYXB0aXZlIikpewogICMgSW1wb3J0IGRhdGEKICBwbG90X21hdCA9IHJlYWQuY3N2KHBhc3RlMChmaWxlX3BhdGgsZmlsZW5hbWUpLCBzZXAgPSAiLCIsIGhlYWRlciA9IFQsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAjIEZpeCBkYXRlIGZvcm1hdAogIHBsb3RfbWF0JEluZGV4ID0gYXMuRGF0ZShwbG90X21hdCRJbmRleCkKICAjIENvbnZlcnQgdG8gYW4geHRzCiAgcGxvdF9tYXQgPSB4dHMocGxvdF9tYXRbLC0xXSwgb3JkZXIuYnkgPSBwbG90X21hdFssMV0pCiAgIyBGaXggY29sdW1uIG5hbWVzCiAgY29sbmFtZXMocGxvdF9tYXQpIDwtIGNuX2lucHV0CiAgIyBQbG90IGV2ZXJ5dGhpbmcKICBwbHRfZGF0YShwbG90X21hdCwgdGF1ID0gdGF1LCByZXNwX3ZhciA9IHJlc3BfdmFyLCBudGVzdCA9IG50ZXN0KQogICMgcGxvdCA9IHBsdF9kYXRhKHBsb3RfbWF0LCB0YXUgPSB0YXUsIHJlc3BfdmFyID0gcmVzcF92YXIsIG50ZXN0ID0gbnRlc3QpCiAgIyBDYWxjdWxhdGUgbG9zc2VzCiAgbF9saXN0ID0gZ2VuX2xvc3NfdGVzdChwbG90X21hdCwgdGF1ID0gdGF1KQogICMgUHV0IGludG8gdGFibGVzCiAgZGYgPSBhcy5kYXRhLmZyYW1lKHJiaW5kKGxfbGlzdFtbMV1dLCBsX2xpc3RbWzJdXSkpCiAgIyBDYWxjdWxhdGUgaW5pdGFsIGFuZCBlbmRpbmcgdGltZSB2YWx1ZQogIHN0YXJ0ID0gaW5kZXgocGxvdF9tYXQpWzFdCiAgZW5kID0gaW5kZXgocGxvdF9tYXQpW25yb3cocGxvdF9tYXQpXQogICMgQWRkIHJvdy9jb2x1bW4gbmFtZXMKICBjb2xuYW1lcyhkZikgPC0gY29sbmFtZXMocGxvdF9tYXRbLC0xXSkKICByb3duYW1lcyhkZikgPC0gYygiTG9zc2VzIiwgIlZhUiBCcmVha3MgKCUpIikKICAjIEVkaXRzIG9uIDUuMTIuMjAyMCAtIGRpdmlkZSB0aGUgdGFibGUgaW50byAyCiAgdXZfZGYgPSBkZlssMTo0XQogIG12X2RmID0gZGZbLDU6OF0KICAjIHV2X2RmCiAgIyBtdl9kZgogIHByaW50KGZvcm1hdHRhYmxlKHV2X2RmKSkKICBwcmludChmb3JtYXR0YWJsZShtdl9kZikpCiAgIyBwcmludCh1dl9kZiAlPiUga2FibGUoY2FwdGlvbiA9ICJBY2N1cmFjeSBvZiBWYVIgRm9yZWNhc3QgZm9yIFBHIE92ZXIgTGFzdCAyMDAgVHJhZGluZyBEYXlzIGluIDIwMDgiLCBkaWdpdHMgPSAzKSAlPiUga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRikgJT4lIGZvb3Rub3RlKGdlbmVyYWwgPSAiVGVzdGVkIFVzaW5nIHRoZSBTeW1tZXRyaWMgQWJzb2x1dGUgVmFsdWUgTW9kZWwiKSkKICAjIHByaW50KG12X2RmICU+JSBrYWJsZShjYXB0aW9uID0gIkFjY3VyYWN5IG9mIFZhUiBGb3JlY2FzdCBmb3IgUEcgT3ZlciBMYXN0IDIwMCBUcmFkaW5nIERheXMgaW4gMjAwOCIsIGRpZ2l0cyA9IDMpICU+JSBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGKSAlPiUgZm9vdG5vdGUoZ2VuZXJhbCA9ICJUZXN0ZWQgVXNpbmcgdGhlIFN5bW1ldHJpYyBBYnNvbHV0ZSBWYWx1ZSBNb2RlbCIpKQogICMgQ29udmVydCB0byB0YWJsZQogICAjIHQxID0gdXZfZGYgJT4lIGthYmxlKGNhcHRpb24gPSBwYXN0ZSgiVW5pdmFyaWF0ZSBDQVZpYVIgUmVzdWx0cyBmb3IgYSAiLCB0YXUqMTAwLCAiJSBWYVIiLCBzZXAgPSAiIiksIGRpZ2l0cyA9IDMpICU+JSBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEYpICU+JSBrYWJsZV9zdHlsaW5nKCkgJT4lIGZvb3Rub3RlKGdlbmVyYWwgPSBwYXN0ZSgiQ2FsY3VsYXRlZCB1c2luZyIsIG50ZXN0LCAidHJhZGluZyBkYXlzIGZyb20iLCBhcy5EYXRlKHN0YXJ0KSwgInRvIiwgYXMuRGF0ZShlbmQpKSkKICAjIHQyID0gbXZfZGYgJT4lIGthYmxlKGNhcHRpb24gPSBwYXN0ZSgiTXVsdGl2YXJpYXRlIENBVmlhUiBSZXN1bHRzIGZvciBhICIsIHRhdSoxMDAsICIlIFZhUiIsIHNlcCA9ICIiKSwgZGlnaXRzID0gMykgJT4lIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRikgJT4lIGthYmxlX3N0eWxpbmcoKSAlPiUgZm9vdG5vdGUoZ2VuZXJhbCA9IHBhc3RlKCJDYWxjdWxhdGVkIHVzaW5nIiwgbnRlc3QsICJ0cmFkaW5nIGRheXMgZnJvbSIsIGFzLkRhdGUoc3RhcnQpLCAidG8iLCBhcy5EYXRlKGVuZCkpKQogICMgcHJpbnQodDEpCiAgIyBwcmludCh0MikKICAjIHByaW50KHV2X2RmICU+JSBrYWJsZShjYXB0aW9uID0gcGFzdGUoIlVuaXZhcmlhdGUgQ0FWaWFSIFJlc3VsdHMgZm9yIGEgIiwgdGF1KjEwMCwgIiUgVmFSIiwgc2VwID0gIiIpLCBkaWdpdHMgPSAzKSAlPiUga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUga2FibGVfc3R5bGluZygpICU+JSBmb290bm90ZShnZW5lcmFsID0gcGFzdGUoIkNhbGN1bGF0ZWQgdXNpbmciLCBudGVzdCwgInRyYWRpbmcgZGF5cyBmcm9tIiwgYXMuRGF0ZShzdGFydCksICJ0byIsIGFzLkRhdGUoZW5kKSkpKQogICMgcHJpbnQobXZfZGYgJT4lIGthYmxlKGNhcHRpb24gPSBwYXN0ZSgiTXVsdGl2YXJpYXRlIENBVmlhUiBSZXN1bHRzIGZvciBhICIsIHRhdSoxMDAsICIlIFZhUiIsIHNlcCA9ICIiKSwgZGlnaXRzID0gMykgJT4lIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRikgJT4lIGthYmxlX3N0eWxpbmcoKSAlPiUgZm9vdG5vdGUoZ2VuZXJhbCA9IHBhc3RlKCJDYWxjdWxhdGVkIHVzaW5nIiwgbnRlc3QsICJ0cmFkaW5nIGRheXMgZnJvbSIsIGFzLkRhdGUoc3RhcnQpLCAidG8iLCBhcy5EYXRlKGVuZCkpKSkKICAjIFJldHVybiB0aGUgeHRzLCB0aGUgcGxvdCwgdGhlIGxvc3MgbGlzdCwgYW5kIHRoZSB0YWJsZXMKICByZXR1cm4obGlzdChwbG90X21hdCkpCiAgIyByZXR1cm4obGlzdChwbG90X21hdCwgcGxvdCwgbF9saXN0LCB0YWJsZXMpKQp9CmBgYAoKRm9yIHRoZSBzYWtlIG9mIGJyZXZpdHksIHRoZSByZXN1bHRzIHdpdGggb25seSBVLlMuIEVURnMsIGdsb2JhbCBFVEZzLCBvciBib25kcyBpcyBpbmNsdWRlZCBpbiBhIGxhdGVyIHJlc3VsdHMgc2VjdGlvbi4gVGhlIHJlc3VsdHMgYXJlIHNpbWlsYXIgdG8gdGhlIHJlc3VsdHMgYmVsb3cuIFRvIHRlc3QgaG93IHdlbGwgdGhlIG1vZGVscyBkbyBhdCBkaWZmZXJlbnQgVmFSIGxldmVscywgMSUsIDUlLCBhbmQgMTAlIGFyZSB0ZXN0ZWQuCgojIyAyMDA4IFRlc3QgUGVyaW9kIC0gQWxsIEVURnMgCgojIyMgMSUgVmFSCgpgYGB7ciwgcmVzdWx0cz0gICdhc2lzJ30KIyBDYWxsIHRoZSBhYm92ZSBmdW5jdGlvbgp2MV8yMDA4X2FsbGV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2FsbF9FVEZfcnVucy8iLCJ2YXJfMXBjXzIwMDhfYWxsX2V0Zi5jc3YiLCAwLjAxKQpgYGAKCiMjIyA1JSBWYVIKCmBgYHtyLCByZXN1bHRzPSAgJ2FzaXMnfQp2NV8yMDA4X2FsbGV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2FsbF9FVEZfcnVucy8iLCJ2YXJfNXBjXzIwMDhfYWxsX2V0Zi5jc3YiLCAwLjA1KQpgYGAKCiMjIyAxMCUgVmFSCgpgYGB7ciwgcmVzdWx0cz0gICdhc2lzJ30KdjEwXzIwMDhfYWxsZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYWxsX0VURl9ydW5zLyIsInZhcl8xMHBjXzIwMDhfYWxsX2V0Zi5jc3YiLCAwLjEwKQpgYGAKClRoZSB1bml2YXJpYXRlIENBVmlhUiBtb2RlbHMgc2lnbmlmaWNhbnRseSBvdXRwZXJmb3JtIHRoZSBtdWx0aXZhcmlhdGUgbW9kZWwsIHBhcnRpY3VsYXJseSBhdCB0aGUgMSUgbGV2ZWwuIFRoZSBleHRyZW1lIGJlaGF2aW9yIHRvd2FyZHMgdGhlIGVuZCBvZiAyMDA4IHByb3ZlZCBkaWZmaWN1bHQgZm9yIHRoZSBtdWx0aXZhcmlhdGUgbW9kZWwgdG8gcGljayB1cCBvbi4KCiMjIDIwMTAgVGVzdCBQZXJpb2QgLSBBbGwgRVRGcwoKIyMjIDElIFZhUgoKYGBge3IsIHJlc3VsdHM9ICAnYXNpcyd9CiMgQ2FsbCB0aGUgYWJvdmUgZnVuY3Rpb24KdjFfMjAxMF9hbGxldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9hbGxfRVRGX3J1bnMvIiwidmFyXzFwY18yMDEwX2FsbF9ldGYuY3N2IiwgMC4wMSkKYGBgCgojIyMgNSUgVmFSCgpgYGB7ciwgcmVzdWx0cz0gICdhc2lzJ30KIyBDYWxsIHRoZSBhYm92ZSBmdW5jdGlvbgp2NV8yMDEwX2FsbGV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2FsbF9FVEZfcnVucy8iLCJ2YXJfNXBjXzIwMTBfYWxsX2V0Zi5jc3YiLCAwLjA1KQpgYGAKCiMjIyAxMCUgVmFSCgpgYGB7ciwgcmVzdWx0cz0gICdhc2lzJ30KIyBDYWxsIHRoZSBhYm92ZSBmdW5jdGlvbgp2MTBfMjAxMF9hbGxldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9hbGxfRVRGX3J1bnMvIiwidmFyXzEwcGNfMjAxMF9hbGxfZXRmLmNzdiIsIDAuMTApCmBgYAoKVGhlIG11bHRpdmFyaWF0ZSBmb3JlY2FzdCBpcyBsYXJnZWx5IGluIGxpbmUgd2l0aCB0aGUgdW5pdmFyaWF0ZSBDQVZpYVIgbW9kZWwuIEdlbmVyYWxseSwgaXQgc2VlbXMgbGlrZSB0aGUgdW5pdmFyaWF0ZSBtb2RlbCBkb2VzIGEgYmV0dGVyIGpvYiB0cmFja2luZyB0aGUgcmVzcG9uc2UgdmFyaWFibGUgaW4gdGhlIGNhc2Ugb2YgYSBsYXJnZSBzd2luZyBiZWNhdXNlIG9mIHRoZSBtb3ZpbmcgYXZlcmFnZSBjb21wb25lbnQuIEFsc28sIHdoaWxlIHRoZSBtdWx0aXZhcmlhdGUgbW9kZWxzIGhhZCBhIHJhdGUgb2YgVmFSIGJyZWFrcyB0aGF0IHdhcyB0b28gaGlnaCBmb3IgMjAwOCwgdGhlIHJhdGUgb2YgVmFSIGJyZWFrcyB3YXMgZ2VuZXJhbGx5IHRvbyBsb3cgZm9yIHRoZSBtdWx0aXZhcmlhdGUgbW9kZWxzIGluIDIwMTAuCgojIyAyMDE0IFRlc3QgUGVyaW9kIC0gQWxsIEVURnMKCiMjIyAxJSBWYVIKCmBgYHtyLCByZXN1bHRzPSAgJ2FzaXMnfQp2MV8yMDE0X2FsbGV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2FsbF9FVEZfcnVucy8iLCJ2YXJfMXBjXzIwMTRfYWxsX2V0Zi5jc3YiLCAwLjAxKQpgYGAKCiMjIyA1JSBWYVIKCmBgYHtyLCByZXN1bHRzPSAgJ2FzaXMnfQp2NV8yMDE0X2FsbGV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2FsbF9FVEZfcnVucy8iLCJ2YXJfNXBjXzIwMTRfYWxsX2V0Zi5jc3YiLCAwLjA1KQpgYGAKCiMjIyAxMCUgVmFSCgpgYGB7ciwgcmVzdWx0cz0gICdhc2lzJ30KdjEwXzIwMTRfYWxsZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYWxsX0VURl9ydW5zLyIsInZhcl8xMHBjXzIwMTRfYWxsX2V0Zi5jc3YiLCAwLjEwKQpgYGAKCkFzIHdpdGggdGhlIDIwMTAgcmVzdWx0cywgdGhlIG11bHRpdmFyaWF0ZSBhbmQgdW5pdmFyaWF0ZSBmb3JlY2FzdHMgYXJlIHZlcnkgc2ltaWxhciBpbiBhY2N1cmFjeSBmb3IgYWxsIDMgVmFSIGxldmVscy4gSW4gdGVybXMgb2YgdGhlIFZhUiBicmVha2FnZSByYXRlIGZvciB0aGUgMSUgbGV2ZWwsIDMgb3V0IG9mIHRoZSA0IG11bHRpdmFyaWF0ZSBtb2RlbHMgd2VyZSBleHRyZW1lbHkgY2xvc2UuIFRoZXJlIGFsc28gYXBwZWFycyB0byBiZSBsZXNzIGRpZmZlcmVudGlhdGlvbiBiZXR3ZWVuIHRoZSBtdWx0aXZhcmlhdGUgYW5kIHRoZSB1bml2YXJpYXRlIG1vZGVscyBjb21wYXJlZCB0byB0aGUgMjAxMCBhbmQgMjAxNCByZXN1bHRzLgoKIyMgMjAxNiBUZXN0IFBlcmlvZCAtIEFsbCBFVEZzCgojIyMgMSUgVmFSCgpgYGB7ciwgcmVzdWx0cz0gICdhc2lzJ30KdjFfMjAxNl9hbGxldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9hbGxfRVRGX3J1bnMvIiwidmFyXzFwY18yMDE2X2FsbF9ldGYuY3N2IiwgMC4wMSkKYGBgCgojIyMgNSUgVmFSCgpgYGB7ciwgcmVzdWx0cz0gICdhc2lzJ30KdjVfMjAxNl9hbGxldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9hbGxfRVRGX3J1bnMvIiwidmFyXzVwY18yMDE2X2FsbF9ldGYuY3N2IiwgMC4wNSkKYGBgCgojIyMgMTAlIFZhUgoKYGBge3IsIHJlc3VsdHM9ICAnYXNpcyd9CnYxMF8yMDE2X2FsbGV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2FsbF9FVEZfcnVucy8iLCJ2YXJfMTBwY18yMDE2X2FsbF9ldGYuY3N2IiwgMC4xMCkKYGBgCgpBcyB3aXRoIDIwMTAgYW5kIDIwMTQsIHRoZSByZXN1bHRzIGJldHdlZW4gbW9kZWwgY2xhc3NlcyBhcmUgc2ltaWxhci4gVGhlIG11bHRpdmFyaWF0ZSBtb2RlbCBwZXJmb3JtcyBxdWl0ZSB3ZWxsIHdpdGggVmFSIGJyZWFrcyBhdCB0aGUgNSUgYW5kIDEwJSBsZXZlbCwgYW5kIHRoZSBtb2RlbHMgc2VlbSB0byBiZSB2ZXJ5IGNsb3NlbHkgY2x1c3RlcmVkIHRvZ2V0aGVyLgoKIyBDb25jbHVzaW9ucyBhbmQgRnV0dXJlIFdvcmsKClRoZSBwcm9ibGVtIG9mIGhvdyB0byBwcmVkaWN0IGEgbG93IHF1YW50aWxlIG9mIGEgc3RvY2sncyBsb2cgcmV0dXJuIHdoZW4gdGhlIHRyYWluaW5nIHNhbXBsZSBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudCBmcm9tIHRoZSB0ZXN0IHNjZW5hcmlvIGlzIGFuIGVub3Jtb3VzbHkgZGlmZmljdWx0IHByb2JsZW0uIEFsbW9zdCBheGlvbWF0aWNhbGx5LCB0aGUgZGlzdHJpYnV0aW9uIGlzIG5vbnN0YXRpb25hcnkgb3ZlciB0aW1lLiBIb3cgaXMgaXQgcG9zc2libGUgdG8gcHJlZGljdCB0aGUgcmV0dXJuIG9mIGFuIGluZGV4IGxpa2UgdGhlIFMmUDUwMCBkdXJpbmcgYSBwZXJpb2Qgb2YgbWFya2V0IHR1cm1vaWwgc3VjaCBhcyB0aGUgR3JlYXQgUmVjZXNzaW9uPyBXaGlsZSB0aGUgdW5pdmFyaWF0ZSBDQVZpYVIgbW9kZWwgcGVyZm9ybXMgY29tcGFyYXRpdmVseSB3ZWxsIGR1cmluZyB0aW1lcyBvZiBzdHJlc3MsIGl0IHBlcmZvcm1zIGFib3V0IHRoZSBzYW1lIGFzIHRoZSBtdWx0aXZhcmlhdGUgQ0FWaWFSIG1vZGVsIGR1cmluZyBtb3JlIGJlbmlnbiBlY29ub21pYyBwZXJpb2RzLgoKVGhpcyBjb25jbHVzaW9uIGRyYXduIGZyb20gdGhlIGFib3ZlIHJlc3VsdHMgbWlnaHQgc3VwcG9ydCB0aGUgbm90aW9uIG9mIGNvbWJpbmluZyB0aGUgdHdvIG1vZGVscyBpbiBzb21lIHNvcnQgb2YgYSBtaXh0dXJlIG1vZGVsIC0gYWltaW5nIHRvIHVzZSB0aGUgYmFza2V0IG9mIEVURnMgZHVyaW5nIGdvb2QgdGltZXMsIGFuZCB1c2UgdGhlIENBVmlhUiBBUk1BIHNwZWNpZmljYXRpb24gZHVyaW5nIGJhZCB0aW1lcy4gVGhlIGFwcHJvYWNoIG9mIHVzaW5nIEVURnMgYWxsb3dzIGEgcHJlZGljdGlvbiBiYXNlZCBvbiBmb3J3YXJkLWxvb2tpbmcgZXhwZWN0YXRpb25zIG9mIGZ1bmRhbWVudGFsIGZhY3RvcnMuIEluZGVlZCwgRVRGcyBhcmUganVzdCBiYXNrZXRzIG9mIGluZGl2aWR1YWwgc3RvY2tzIG9yIGJvbmRzLCBhbmQgdGhvc2Ugc2VjdXJpdGllcyBhcmUgKGluIHRoZW9yeSkgYmFzZWQgb24gcmF0aW9uYWwgZXhwZWN0YXRpb25zIGFib3V0IGZ1dHVyZSByZXNvdXJjZXMsIG1hcmtldCBjb25kaXRpb25zLCBldGMgLSB0aGUgbWljcm9mb3VuZGF0aW9ucyBvZiB3aGF0IGRyaXZlcyBvdXIgZWNvbm9teS4gVGhlIEFSTUEgc3BlY2lmaWNhdGlvbiwgd2hpbGUgcHJhY3RpY2FsbHkgYW5kIHN0YXRpc3RpY2FsbHkgc291bmQsIGlzIGNvbnRyYWRpY3RlZCBieSBlY29ub21pYyB0aGVvcnkgYW5kIHByYWN0aWNlIC0gdGhlIHdlYWsgZm9ybSBvZiB0aGUgZWZmaWNpZW50IG1hcmtldCBoeXBvdGhlc2lzIHN0YXRlcyB0aGF0IGl0IGlzIGltcG9zc2libGUgdG8gZm9yZWNhc3QgZnV0dXJlIHZhbHVlcyBvZiBhc3NldCBwcmljZXMgdXNpbmcgcGFzdCB2YWx1ZXMuIEJ1dCBwZXJoYXBzIHRoaXMgdmlldyBpcyBpbmNvbXBsZXRlLgoKQW55IG1vZGVsIHRoYXQgYXR0ZW1wdHMgdG8gY2FwdHVyZSByZWxhdGlvbnNoaXBzIGluIHRoZSByZWFsIHdvcmxkIHdpbGwgb25seSB3b3JrIHVudGlsIGFuIG9taXR0ZWQgdmFyaWFibGUgaXMgZm91bmQuIFRoZSBlbGVnYW5jZSBvZiB0aGUgbXVsdGl2YXJpYXRlIENBVmlhUiBtb2RlbCBpcyB0aGF0IGl0IHByb3ZpZGVzIGluc2lnaHQgaW50byB3aHkgYSBwcmVkaWN0aW9uIGlzIHdyb25nOyB0aGUgY2hhbmdlIGluIHRoZSBhbmdsZSBiZXR3ZWVuIHJlc3VsdGFudCB2ZWN0b3JzIGlzIGEgc2Vuc2libGUgbWVhc3VyZW1lbnQgb2YgZWNvbm9taWMgY2hhbmdlcG9pbnRzLiBIb3dldmVyLCBlcnJvcnMgaW4gdGhlIHdvcmxkIGFyZSBjb3N0bHksIGFuZCBpdCBpcyB3aXNoZnVsIHRoaW5raW5nIHRvIHNheSB0aGF0IGV4cGxhaW5pbmcgd2h5IHRoZSBlcnJvciBvY2N1cnJlZCBpcyBzdWZmaWNpZW50LgoKQXMgc3VjaCwgZm9yIGZ1dHVyZSB3b3JrIGl0IGlzIHdvcnRoIGV4cGxvcmluZyB0aGUgbm90aW9uIG9mIHdlaWdodGluZyBhbiBBUk1BLWFwcHJvYWNoIG1vcmUgaGVhdmlseSB3aGVuIHByZWRpY3Rpb25zIHVzaW5nIGZ1bmRhbWVudGFscyB3ZXJlIHRvbyBoaWdoLCB0aGVuIG5vdCBvbmx5IHdvdWxkIHRoaXMgYWZ0ZXItdGhlLWZhY3QgcmVjb2duaXRpb24gYmUgYWNoaWV2ZWQsIGJ1dCBhbHNvIGEgaGllcmFyY2hpY2FsIG1vZGVsIHRoYXQgY2FwdHVyZXMgZnVuZGFtZW50YWwgcmVsYXRpb25zaGlwcyBpbiB0aGUgZWNvbm9teSBhbmQgcG90ZW50aWFsbHkgY2hhbmdlcyBvdXIgdW5kZXJzdGFuZGluZyBvZiBhc3NldCBwcmljZXMgaW4gZ2VuZXJhbCAtIGEgc3ludGhlc2lzIGJldHdlZW4gS2V5bmVzJyBhbmltYWwgc3Bpcml0cyBkdXJpbmcgYSB0aW1lIG9mIHNldmVyZSBjcmlzaXM7IHdoZXJlIGEgbW9kZWwgY2Fubm90IGV4cGxhaW4gc2hpZnRzLCBhbmQgYSBtb3JlIHJhdGlvbmFsIHdvcmxkIHRoYXQgZXhwbGFpbnMgb3RoZXIgcGVyaW9kcy4gSW4gYWRkaXRpb24gdG8gc2lnbmlmaWNhbnQgcHJlZGljdGl2ZSBwb3dlciBiZWNhdXNlIG9mIHRoZSBzd2l0Y2hpbmcgYmV0d2VlbiB0aGUgdHdvIHdvcmxkcywgdGhlcmUgaXMgYWxzbyBhbiBlbGVnYW50IGV4cGxhbmF0aW9uOyBhIHdheSB0byBleHBsYWluIGNoYW5nZXMgaW4gdGhlIHVzZWZ1bG5lc3Mgb2YgdGhlIHVuZGVycGlubmluZ3MgaW4gdGhlIGVjb25vbXkuIEJlY2F1c2Ugb2YgdGhlIGZsZXhpYmlsaXR5IG9mIHRoZSBtb2RlbCwgaXQgaXMgZW50aXJlbHkgcG9zc2libGUgdGhhdCBhIHdob2xlIGdhbXV0IG9mIHZhcmlhYmxlcyBjb3VsZCBiZSB0b3NzZWQgaW4gYW5kIGJhY2t0ZXN0ZWQgdG8gd2hlbiAiY2hhbmdlcG9pbnRzIiBvY2N1cnJlZC4gCgpBZGRpdGlvbmFsIGZ1dHVyZSB3b3JrIGludm9sdmVzIGRldmVsb3BpbmcgdGhlb3JldGljYWwgZ3VhcmFudGVlcyBvbiB0aGUgcGFyYW1ldGVycyBpbiB0aGUgbXVsdGl2YXJpYXRlIENBVmlhUiBtb2RlbC4gT25lIGFkdmFudGFnZSBvZiBib3RoIHRoZSBkaWZmdXNpb24gaW5kZXggbW9kZWwgYW5kIHRoZSBDQVZpYVIgbW9kZWwgaXMgdGhhdCBib3RoIGhhdmUgdGhlb3JlbXMgYWJvdXQgYXN5bXB0b3RpYyBub3JtYWxpdHkgYW5kIGNvbnNpc3RlbmN5LgoKIyBBZGRpdGlvbmFsIFJlc3VsdHMKCiMjIDIwMDggVGVzdCBQZXJpb2QKCiMjIyBVLlMuIEVURnMKCmBgYHtyfQojIENhbGwgdGhlIGFib3ZlIGZ1bmN0aW9uCnYxXzIwMDhfdXNldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9VU19FVEZfcnVucy8iLCJ2YXJfMXBjXzIwMDhfdXNfZXRmLmNzdiIsIDAuMDEpCnY1XzIwMDhfdXNldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9VU19FVEZfcnVucy8iLCJ2YXJfNXBjXzIwMDhfdXNfZXRmLmNzdiIsIDAuMDUpCnYxMF8yMDA4X3VzZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfVVNfRVRGX3J1bnMvIiwidmFyXzEwcGNfMjAwOF91c19ldGYuY3N2IiwgMC4xMCkKCmBgYAoKVGhlIHJlc3VsdHMgZm9yIHRoZSBVLlMuIEVURnMgY2xlYXJseSBzaG93IHRoYXQgdGhlIHVuaXZhcmlhdGUgbW9kZWwgb3V0cGVyZm9ybXMgdGhlIG11bHRpdmFyaWF0ZSBtb2RlbCBkdXJpbmcgdGhlIGdyZWF0IHJlY2Vzc2lvbi4KCiMjIyBHbG9iYWwgRVRGcwoKYGBge3J9CiMgQ2FsbCB0aGUgYWJvdmUgZnVuY3Rpb24KdjFfMjAwOF9nbG9iZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfZ2xvYl9FVEZfcnVucy8iLCJ2YXJfMXBjXzIwMDhfZ2xvYl9ldGYuY3N2IiwgMC4wMSkKdjVfMjAwOF9nbG9iZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfZ2xvYl9FVEZfcnVucy8iLCJ2YXJfNXBjXzIwMDhfZ2xvYl9ldGYuY3N2IiwgMC4wNSkKdjEwXzIwMDhfZ2xvYmV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2dsb2JfRVRGX3J1bnMvIiwidmFyXzEwcGNfMjAwOF9nbG9iX2V0Zi5jc3YiLCAwLjEwKQpgYGAKCldoaWxlIHRoZSBtb2RlbCB3aXRoIHRoZSBnbG9iYWwgRVRGcyBhcyBwcmVkaWN0b3JzIHBlcmZvcm1zIGJldHRlciB0aGFuIHRoZSBtb2RlbCB3aXRoIFUuUy4gRVRGcywgdGhlIHVuaXZhcmlhdGUgQ0FWaWFSIG1vZGVsIG91dHBlcmZvcm1zIHRoZSBtdWx0aXZhcmlhdGUgbW9kZWwuCgojIyMgQm9uZCBFVEZzCgpgYGB7cn0KIyBDYWxsIHRoZSBhYm92ZSBmdW5jdGlvbgp2MV8yMDA4X2JvbmRldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9ib25kX0VURl9ydW5zLyIsInZhcl8xcGNfMjAwOF9ib25kX2V0Zi5jc3YiLCAwLjAxKQp2NV8yMDA4X2JvbmRldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9ib25kX0VURl9ydW5zLyIsInZhcl81cGNfMjAwOF9ib25kX2V0Zi5jc3YiLCAwLjA1KQp2MTBfMjAwOF9ib25kZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYm9uZF9FVEZfcnVucy8iLCJ2YXJfMTBwY18yMDA4X2JvbmRfZXRmLmNzdiIsIDAuMTApCmBgYAoKQXMgd2l0aCB0aGUgcHJldmlvdXMgdHdvIHJ1bnMsIHRoZSB1bml2YXJpYXRlIG1vZGVsIG91dHBlcmZvcm1zIHRoZSBtdWx0aXZhcmlhdGUgbW9kZWwuCgojIyAyMDEwIFRlc3QgUGVyaW9kCgojIyMgVS5TLiBFVEZzCgpgYGB7cn0KIyBDYWxsIHRoZSBhYm92ZSBmdW5jdGlvbgp2MV8yMDEwX3VzZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfVVNfRVRGX3J1bnMvIiwidmFyXzFwY18yMDEwX3VzX2V0Zi5jc3YiLCAwLjAxKQp2NV8yMDEwX3VzZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfVVNfRVRGX3J1bnMvIiwidmFyXzVwY18yMDEwX3VzX2V0Zi5jc3YiLCAwLjA1KQp2MTBfMjAxMF91c2V0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX1VTX0VURl9ydW5zLyIsInZhcl8xMHBjXzIwMTBfdXNfZXRmLmNzdiIsIDAuMTApCmBgYAoKVGhlIHJlc3VsdHMgYXJlIG11Y2ggYmV0dGVyIGZvciB0aGUgbXVsdGl2YXJpYXRlIG1vZGVsIGhlcmUgZHVyaW5nIGEgbW9yZSBiZW5pZ24gcGVyaW9kLgoKIyMjIEdsb2JhbCBFVEZzCgpgYGB7cn0KIyBDYWxsIHRoZSBhYm92ZSBmdW5jdGlvbgp2MV8yMDEwX2dsb2JldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9nbG9iX0VURl9ydW5zLyIsInZhcl8xcGNfMjAxMF9nbG9iX2V0Zi5jc3YiLCAwLjAxKQp2NV8yMDEwX2dsb2JldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9nbG9iX0VURl9ydW5zLyIsInZhcl81cGNfMjAxMF9nbG9iX2V0Zi5jc3YiLCAwLjA1KQp2MTBfMjAxMF9nbG9iZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfZ2xvYl9FVEZfcnVucy8iLCJ2YXJfMTBwY18yMDEwX2dsb2JfZXRmLmNzdiIsIDAuMTApCmBgYAoKQXMgd2l0aCB0aGUgVS5TLiBFVEZzLCB0aGUgcmVzdWx0cyBhcmUgYmV0dGVyLgoKIyMjIEJvbmQgRVRGcwoKYGBge3J9CiMgQ2FsbCB0aGUgYWJvdmUgZnVuY3Rpb24KdjFfMjAxMF9ib25kZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYm9uZF9FVEZfcnVucy8iLCJ2YXJfMXBjXzIwMTBfYm9uZF9ldGYuY3N2IiwgMC4wMSkKdjVfMjAxMF9ib25kZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYm9uZF9FVEZfcnVucy8iLCJ2YXJfNXBjXzIwMTBfYm9uZF9ldGYuY3N2IiwgMC4wNSkKdjEwXzIwMTBfYm9uZGV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2JvbmRfRVRGX3J1bnMvIiwidmFyXzEwcGNfMjAxMF9ib25kX2V0Zi5jc3YiLCAwLjEwKQpgYGAKCkFzIHdpdGggdGhlIHByZXZpb3VzIHR3byBydW5zLCB0aGUgcmVzdWx0cyBmcm9tIHRoZSBib25kIEVURnMgYXJlIGJldHRlciB0aGFuIHRob3NlIGZyb20gMjAwOC4KCiMjIDIwMTQgVGVzdCBQZXJpb2QKCiMjIyBVLlMuIEVURnMKCmBgYHtyfQojIENhbGwgdGhlIGFib3ZlIGZ1bmN0aW9uCnYxXzIwMTRfdXNldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9VU19FVEZfcnVucy8iLCJ2YXJfMXBjXzIwMTRfdXNfZXRmLmNzdiIsIDAuMDEpCnY1XzIwMTRfdXNldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9VU19FVEZfcnVucy8iLCJ2YXJfNXBjXzIwMTRfdXNfZXRmLmNzdiIsIDAuMDUpCnYxMF8yMDE0X3VzZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfVVNfRVRGX3J1bnMvIiwidmFyXzEwcGNfMjAxNF91c19ldGYuY3N2IiwgMC4xMCkKYGBgCgpBcyB3aXRoIHRoZSByZXN1bHRzIGluIDIwMTQsIHRoZSByZXN1bHRzIGZyb20gdGhlIFUuUy4gRVRGcyBzaG93cyBhIHNpbWlsYXIgcXVhbGl0eSBvZiBwcmVkaWN0aW9ucy4KCiMjIyBHbG9iYWwgRVRGcwoKYGBge3J9CiMgQ2FsbCB0aGUgYWJvdmUgZnVuY3Rpb24KdjFfMjAxNF9nbG9iZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfZ2xvYl9FVEZfcnVucy8iLCJ2YXJfMXBjXzIwMTRfZ2xvYl9ldGYuY3N2IiwgMC4wMSkKdjVfMjAxNF9nbG9iZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfZ2xvYl9FVEZfcnVucy8iLCJ2YXJfNXBjXzIwMTRfZ2xvYl9ldGYuY3N2IiwgMC4wNSkKdjEwXzIwMTRfZ2xvYmV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2dsb2JfRVRGX3J1bnMvIiwidmFyXzEwcGNfMjAxNF9nbG9iX2V0Zi5jc3YiLCAwLjEwKQpgYGAKClRoZSByZXN1bHRzIHNob3cgdGhhdCB0aGUgbXVsdGl2YXJpYXRlIHByZWRpY3Rpb25zIGFyZSBvZiBzaW1pbGFyIHF1YWxpdHkgdG8gdGhlIHByZWRpY3Rpb25zIGZyb20gdGhlIHVuaXZhcmlhdGUgbW9kZWwuIAoKIyMjIEJvbmQgRVRGcwoKYGBge3J9CiMgQ2FsbCB0aGUgYWJvdmUgZnVuY3Rpb24KdjFfMjAxNF9ib25kZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYm9uZF9FVEZfcnVucy8iLCJ2YXJfMXBjXzIwMTRfYm9uZF9ldGYuY3N2IiwgMC4wMSkKdjVfMjAxNF9ib25kZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYm9uZF9FVEZfcnVucy8iLCJ2YXJfNXBjXzIwMTRfYm9uZF9ldGYuY3N2IiwgMC4wNSkKdjEwXzIwMTRfYm9uZGV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2JvbmRfRVRGX3J1bnMvIiwidmFyXzEwcGNfMjAxNF9ib25kX2V0Zi5jc3YiLCAwLjEwKQpgYGAKCkFzIHdpdGggdGhlIG90aGVyIHR3byBzZXRzIG9mIHJlZ3Jlc3NvcnMsIHRoZSByZXN1bHRzIGhlcmUgc2hvdyB0aGF0IHRoZSBtdWx0aXZhcmlhdGUgcHJlZGljdGlvbnMgYXJlIG9mIHNpbWlsYXIgcXVhbGl0eSB0byB0aGUgcHJlZGljdGlvbnMgZnJvbSB0aGUgdW5pdmFyaWF0ZSBtb2RlbC4gCgojIyAyMDE2IFRlc3QgUGVyaW9kCgojIyMgVS5TLiBFVEZzCgpgYGB7cn0KIyBDYWxsIHRoZSBhYm92ZSBmdW5jdGlvbgp2MV8yMDE2X3VzZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfVVNfRVRGX3J1bnMvIiwidmFyXzFwY18yMDE2X3VzX2V0Zi5jc3YiLCAwLjAxKQp2NV8yMDE2X3VzZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfVVNfRVRGX3J1bnMvIiwidmFyXzVwY18yMDE2X3VzX2V0Zi5jc3YiLCAwLjA1KQp2MTBfMjAxNl91c2V0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX1VTX0VURl9ydW5zLyIsInZhcl8xMHBjXzIwMTZfdXNfZXRmLmNzdiIsIDAuMTApCmBgYAoKQXMgd2l0aCB0aGUgZm9yZWNhc3QgaW4gMjAxMCBhbmQgMjAxNCwgaW5jbHVkaW5nIHRoZSBVLlMuIEVURnMgYXMgcHJlZGljdG9ycyBpbiB0aGUgbXVsdGl2YXJpYXRlIG1vZGVsIGdpdmVzIHNpbWlsYXIgcmVzdWx0cyB0byB0aGF0IG9mIHRoZSB1bml2YXJpYXRlIG1vZGVsLgoKIyMjIEdsb2JhbCBFVEZzCgpgYGB7cn0KIyBDYWxsIHRoZSBhYm92ZSBmdW5jdGlvbgp2MV8yMDE2X2dsb2JldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9nbG9iX0VURl9ydW5zLyIsInZhcl8xcGNfMjAxNl9nbG9iX2V0Zi5jc3YiLCAwLjAxKQp2NV8yMDE2X2dsb2JldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9nbG9iX0VURl9ydW5zLyIsInZhcl81cGNfMjAxNl9nbG9iX2V0Zi5jc3YiLCAwLjA1KQp2MTBfMjAxNl9nbG9iZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfZ2xvYl9FVEZfcnVucy8iLCJ2YXJfMTBwY18yMDE2X2dsb2JfZXRmLmNzdiIsIDAuMTApCmBgYAoKVGhlIGdsb2JhbCBFVEZzIGFzIHByZWRpY3RvcnMgcHJvdmlkZSBzb2xpZCByZXN1bHRzIGFzIHdlbGwuCgoKIyMjIEJvbmQgRVRGcwoKYGBge3J9CiMgQ2FsbCB0aGUgYWJvdmUgZnVuY3Rpb24KdjFfMjAxNl9ib25kZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYm9uZF9FVEZfcnVucy8iLCJ2YXJfMXBjXzIwMTZfYm9uZF9ldGYuY3N2IiwgMC4wMSkKdjVfMjAxNl9ib25kZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYm9uZF9FVEZfcnVucy8iLCJ2YXJfNXBjXzIwMTZfYm9uZF9ldGYuY3N2IiwgMC4wNSkKdjEwXzIwMTZfYm9uZGV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2JvbmRfRVRGX3J1bnMvIiwidmFyXzEwcGNfMjAxNl9ib25kX2V0Zi5jc3YiLCAwLjEwKQpgYGAKCkFzIHdpdGggdGhlIFUuUy4gYW5kIEdsb2JhbCBFVEZzLCB0aGUgYm9uZCBFVEZzIHByb3ZpZGUgZ29vZCByZXN1bHRzLgoKIyBDb2RlIEFwcGVuZGl4CgpgYGB7ciByZWYubGFiZWw9a25pdHI6OmFsbF9sYWJlbHMoKSwgZWNobyA9IFQsIGV2YWwgPSBGfQpgYGAKCiMgTGl0ZXJhdHVyZSBDaXRlZAo=